PXA300/310的2D图形加速示例代码

本文分享了一次使用PXA300/310的2D图形加速库的经历,解决了缩放功能不工作的难题,并提供了一个测试程序供读者参考。

转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot com>

第一次使用PXA300/310的2D图形加速库,真是有点麻烦。其中一个问题就是缩放功能根本不工作,只要一执行缩放功能系统就不动了,折腾了两天时间才找出原因(datasheet太长,否则花两天时间去读datasheet也不会出现这个问题了)。网上也找不相关资料,这里放个测试程序供大家参考吧(有兴趣的朋友可以拿新版本的broncho a1测试一下)。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include "m2d_lib.h" #define FB_W 320 #define FB_H 480 void test_fill(struct m2d_context* ctx, struct m2d_buff *src, int w, int h, GCU_PIXEL_FORMAT format, GCU_COLOR_VALUE color) { int ret = 0; struct m2d_op_region region; memset(&region, 0x00, sizeof(region)); region.width = w; region.height = h; ret = m2d_set_dstbuf2(ctx, src); ret = m2d_set_fill_color(ctx, format, color); ret = m2d_color_fill(ctx, &region); ret = m2d_set_dstbuf2(ctx, src); m2d_set_line_width(ctx, 2); ret = m2d_set_line_color(ctx, format, 0xff); ret = m2d_draw_line(ctx, w/4, 0, w/4, h-1); ret = m2d_draw_line(ctx, w/2, 0, w/2, h-1); ret = m2d_draw_line(ctx, 3*w/4, 0, 3*w/4, h-1); ret = m2d_sync(ctx); return; } void test_stretch(struct m2d_context* ctx, struct m2d_buff* fb, struct m2d_buff *src) { int ret = 0; struct m2d_op_region region; printf("%s:%d/n", __func__, __LINE__); memset(&region, 0x00, sizeof(region)); region.width = FB_W/4; region.height = FB_H/4; ret = m2d_set_srcbuf0(ctx, src); ret = m2d_set_dstbuf2(ctx, fb); ret = m2d_stretch_blt(ctx, &region, FB_W, FB_H); ret = m2d_submit(ctx); return; } void test_decimate(struct m2d_context* ctx, struct m2d_buff* fb, struct m2d_buff *src) { int ret = 0; struct m2d_op_region region; printf("%s:%d/n", __func__, __LINE__); memset(&region, 0x00, sizeof(region)); region.width = FB_W/2; region.height = FB_H/2; ret = m2d_set_srcbuf0(ctx, src); ret = m2d_set_dstbuf2(ctx, fb); ret = m2d_decimate_blt(ctx, &region, FB_W/2, FB_H/2); ret = m2d_submit(ctx); return; } void test_scale(struct m2d_context* ctx, struct m2d_buff* fb, struct m2d_buff *src) { int ret = 0; struct m2d_op_region region; printf("%s:%d/n", __func__, __LINE__); memset(&region, 0x00, sizeof(region)); region.width = FB_W-1; region.height = FB_H-1; ret = m2d_set_srcbuf0(ctx, src); ret = m2d_set_dstbuf2(ctx, fb); ret = m2d_scale_blt(ctx, &region, 0x100); ret = m2d_submit(ctx); return; } void test_bias(struct m2d_context* ctx, struct m2d_buff* fb, struct m2d_buff *src) { int ret = 0; struct m2d_op_region region; printf("%s:%d/n", __func__, __LINE__); memset(&region, 0x00, sizeof(region)); region.width = FB_W-1; region.height = FB_H-1; ret = m2d_set_srcbuf0(ctx, src); ret = m2d_set_dstbuf2(ctx, fb); ret = m2d_bias_blt(ctx, &region, 0); ret = m2d_submit(ctx); return; } void test_rotate(struct m2d_context* ctx, struct m2d_buff* fb, struct m2d_buff *src, int w, int h, GCU_ROTATION rot) { int ret = 0; struct m2d_op_region region; printf("%s:%d/n", __func__, __LINE__); memset(&region, 0x00, sizeof(region)); region.width = w; region.height = h; ret = m2d_set_srcbuf0(ctx, src); ret = m2d_set_dstbuf2(ctx, fb); ret = m2d_rotate_blt(ctx, &region, rot); ret = m2d_submit(ctx); return; } GCU_COLOR_VALUE bg[] = {0xFFFF, 0x1F, 0x7E0, 0xF40000, 0x00}; int main(int argc, char* argv[]) { struct m2d_context* ctx = m2d_create_context(); struct m2d_buff* fb = m2d_get_primary(); struct m2d_buff *src = m2d_alloc_buffer(ctx, FB_W, FB_H, GCU_PXLFMT_RGB565); struct m2d_buff *rsrc = m2d_alloc_buffer(ctx, FB_H, FB_W, GCU_PXLFMT_RGB565); test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF); test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xF800); test_scale(ctx, fb, src); sleep(1); test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF); sleep(1); test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0x7E0); test_bias(ctx, fb, src); sleep(1); test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF); sleep(1); test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xF800); test_stretch(ctx, fb, src); sleep(1); test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF); sleep(1); test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0x7E0); test_decimate(ctx, fb, src); sleep(1); test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF); sleep(1); test_fill(ctx, rsrc, FB_H, FB_W, GCU_PXLFMT_RGB565, 0xF800); test_rotate(ctx, fb, rsrc, FB_H, FB_W, GCU_ROTATE_90); sleep(1); test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF); sleep(1); test_fill(ctx, rsrc, FB_H, FB_W, GCU_PXLFMT_RGB565, 0xF800); test_rotate(ctx, fb, rsrc, FB_H, FB_W, GCU_ROTATE_270); sleep(1); test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF); sleep(1); test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xF800); test_rotate(ctx, fb, src, FB_W, FB_H, GCU_ROTATE_0); sleep(1); test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF); sleep(1); test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xF800); test_rotate(ctx, fb, src, FB_W, FB_H, GCU_ROTATE_180); sleep(1); m2d_free_buffer(ctx, src); m2d_free_buffer(ctx, rsrc); m2d_free_context(ctx); return 0; }
说明一下:
1.如果你希望命令立即执行时,记得调用一下m2d_submit(ctx)。
2.缩放的宽度是有限制的,具体参数看看datasheet。

内容概要:本文介绍了一个基于Matlab的综合能源系统优化调度仿真资源,重点实现了含光热电站、有机朗肯循环(ORC)和电含光热电站、有机有机朗肯循环、P2G的综合能源优化调度(Matlab代码实现)转气(P2G)技术的冷、热、电多能互补系统的优化调度模型。该模型充分考虑多种能源形式的协同转换与利用,通过Matlab代码构建系统架构、设定约束条件并求解优化目标,旨在提升综合能源系统的运行效率与经济性,同时兼顾灵活性供需不确定性下的储能优化配置问题。文中还提到了相关仿真技术支持,如YALMIP工具包的应用,适用于复杂能源系统的建模与求解。; 适合人群:具备一定Matlab编程基础和能源系统背景知识的科研人员、研究生及工程技术人员,尤其适合从事综合能源系统、可再生能源利用、电力系统优化等方向的研究者。; 使用场景及目标:①研究含光热、ORC和P2G的多能系统协调调度机制;②开展考虑不确定性的储能优化配置与经济调度仿真;③学习Matlab在能源系统优化中的建模与求解方法,复现高水平论文(如EI期刊)中的算法案例。; 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码和案例文件,按照目录顺序逐步学习,重点关注模型构建逻辑、约束设置与求解器调用方式,并通过修改参数进行仿真实验,加深对综合能源系统优化调度的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值