页次: 1
目前是基于xboot做的,系统关联性不强,FairyGUI那个群主要是说怎么用这个软件做游戏,至于实现方面说起来内容有点多。
1、首先做一个插件,识别FairyGUI里面生成的各种控件、动画属性,生成C代码
2、控件最小对象是图片,图片以各种组合方式,组成其他控件(比如图片文字,button、List、Menu等)
3、控件属性包含位置、大小、透明度、缩放比例、旋转角度等等
4、控件显示做成播放器方式,根据控件属性循环播放控件
5、动画实现根据FariyGUI导出的动画属性,加上时间戳,所以动画的播放只用将该动画属性时间戳归零(动画可多动画组合)
6、每一个界面以Screen为单位,每个Screen结构包含控件List、动画List等,切换界面只用播放器的全局Screen指针
7、最后晕哥传的视频,是添加了四叉树脏矩形算法,显示效率提高了接近2.5倍,原本全屏刷写约20帧多一点
Gardenia 说:楼主休完假了吧?我这边也是需要图形的,方便发我邮箱吗?4201842@qq.com
我试了一下发现我的改动太分散,而且xboot和我另外一个框架绑在一起,不好给你,我还是给你说下几个改动吧
1. skip compress [sys-copyself.c]+#if CONFIG_LZ_COMPRESS
sys_spi_flash_init();
sys_spi_flash_read(16384, &z, sizeof(struct zdesc_t));
sys_spi_flash_exit();
...
sys_decompress(tmp, ssize, mem, dsize);
}
else
+#endif2. Disable logs [arch/arm32/mach-f1c100s/include/configs.h]
+#define CONFIG_NO_LOG (1)
3. 优化了SPI读写
/* * sys-spi-flash.c * * Copyright(c) 2007-2018 Jianjun Jiang <8192542@qq.com> * Official site: http://xboot.org * Mobile phone: +86-18665388956 * QQ: 8192542 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include <xboot.h> enum { SPI_GCR = 0x04, SPI_TCR = 0x08, SPI_IER = 0x10, SPI_ISR = 0x14, SPI_FCR = 0x18, SPI_FSR = 0x1c, SPI_WCR = 0x20, SPI_CCR = 0x24, SPI_MBC = 0x30, SPI_MTC = 0x34, SPI_BCC = 0x38, SPI_TXD = 0x200, SPI_RXD = 0x300, }; void sys_spi_flash_init(void) { virtual_addr_t addr; u32_t val; /* Config GPIOC0, GPIOC1, GPIOC2 and GPIOC3 */ addr = 0x01c20848 + 0x00; val = read32(addr); val &= ~(0xf << ((0 & 0x7) << 2)); val |= ((0x2 & 0x7) << ((0 & 0x7) << 2)); write32(addr, val); val = read32(addr); val &= ~(0xf << ((1 & 0x7) << 2)); val |= ((0x2 & 0x7) << ((1 & 0x7) << 2)); write32(addr, val); val = read32(addr); val &= ~(0xf << ((2 & 0x7) << 2)); val |= ((0x2 & 0x7) << ((2 & 0x7) << 2)); write32(addr, val); val = read32(addr); val &= ~(0xf << ((3 & 0x7) << 2)); val |= ((0x2 & 0x7) << ((3 & 0x7) << 2)); write32(addr, val); /* Deassert spi0 reset */ addr = 0x01c202c0; val = read32(addr); val |= (1 << 20); write32(addr, val); /* Open the spi0 bus gate */ addr = 0x01c20000 + 0x60; val = read32(addr); val |= (1 << 20); write32(addr, val); /* Set spi clock rate control register, divided by 4 */ addr = 0x01c05000; write32(addr + SPI_CCR, 0x00001000); /* Enable spi0 and do a soft reset */ addr = 0x01c05000; val = read32(addr + SPI_GCR); val |= (1 << 31) | (1 << 7) | (1 << 1) | (1 << 0); write32(addr + SPI_GCR, val); while(read32(addr + SPI_GCR) & (1 << 31)); val = read32(addr + SPI_TCR); val &= ~(0x3 << 0); val |= (1 << 6) | (1 << 2); write32(addr + SPI_TCR, val); val = read32(addr + SPI_FCR); val |= (1 << 31) | (1 << 15); write32(addr + SPI_FCR, val); } void sys_spi_flash_exit(void) { virtual_addr_t addr = 0x01c05000; u32_t val; /* Disable the spi0 controller */ val = read32(addr + SPI_GCR); val &= ~((1 << 1) | (1 << 0)); write32(addr + SPI_GCR, val); } static void sys_spi_select(void) { virtual_addr_t addr = 0x01c05000; u32_t val; val = read32(addr + SPI_TCR); val &= ~((0x3 << 4) | (0x1 << 7)); val |= ((0 & 0x3) << 4) | (0x0 << 7); write32(addr + SPI_TCR, val); } static void sys_spi_deselect(void) { virtual_addr_t addr = 0x01c05000; u32_t val; val = read32(addr + SPI_TCR); val &= ~((0x3 << 4) | (0x1 << 7)); val |= ((0 & 0x3) << 4) | (0x1 << 7); write32(addr + SPI_TCR, val); } #define SPI0_BASE (0x01c05000) static inline void sys_spi_write_txbuf(u8_t * buf, int len) { // virtual_addr_t addr = 0x01c05000; int i; if(!buf) len = 0; write32(SPI0_BASE + SPI_MTC, len & 0xffffff); write32(SPI0_BASE + SPI_BCC, len & 0xffffff); for(i = 0; i < len; ++i) write8(SPI0_BASE + SPI_TXD, *buf++); } static int sys_spi_transfer(void * txbuf, void * rxbuf, int len) { // virtual_addr_t addr = 0x01c05000; int count = len; u8_t * tx = txbuf; u8_t * rx = rxbuf; u8_t val; int n, i; while(count > 0) { n = (count <= 64) ? count : 64; write32(SPI0_BASE + SPI_MBC, n); sys_spi_write_txbuf(tx, n); write32(SPI0_BASE + SPI_TCR, read32(SPI0_BASE + SPI_TCR) | (1 << 31)); // while((read32(SPI0_BASE + SPI_FSR) & 0xff) < n); for(i = 0; i < n; i++) { while((read32(SPI0_BASE + SPI_FSR) & 0xff) == 0); val = read8(SPI0_BASE + SPI_RXD); if(rx) *rx++ = val; } if(tx) tx += n; count -= n; } return len; } static int sys_spi_write_then_read(void * txbuf, int txlen, void * rxbuf, int rxlen) { if(sys_spi_transfer(txbuf, NULL, txlen) != txlen) return -1; if(sys_spi_transfer(NULL, rxbuf, rxlen) != rxlen) return -1; return 0; } void sys_spi_flash_read(int addr, void * buf, int count) { u8_t tx[4]; tx[0] = 0x03; tx[1] = (u8_t)(addr >> 16); tx[2] = (u8_t)(addr >> 8); tx[3] = (u8_t)(addr >> 0); sys_spi_select(); sys_spi_write_then_read(tx, 4, buf, count); sys_spi_deselect(); }
4. Remove shells and Lua frameworks
+#if XBOOT_SHELL_ENABLE
/* Do auto boot */
Add a comment to this line
do_autoboot();
//run_shell();
system("/application/examples");
}
+#else
+ while(1);
+#endifmake file remove these lines:
- framework \
- framework/base64 \
- framework/display \
- framework/event \
- framework/hardware \
- framework/lang \
- framework/stopwatch \-INCDIRS += xboot/src/external/lua-5.3.4
-SRCDIRS += xboot/src/external/lua-5.3.4
-INCDIRS += xboot/src/external/lua-cjson-2.1.0
-SRCDIRS += xboot/src/external/lua-cjson-2.1.0再把romdisk删掉一些,我只留了ttf文件
5. 参照xboot最新版,加上编译选项 —ffunction-sections和—gc-sections [这个一定要做,能省1.xMB]
6. SPI升到100MHz [arch/arm32/mach-f1c100s/sys-spi-flash.c]
- write32(addr + SPI_CCR, 0x00001001);
+ write32(addr + SPI_CCR, 0x00001000);7. CPU生到最高频率720Mhz [arch/arm32/mach-f1c100s/sys-clock.c]
- clock_set_pll_cpu(408000000);
+ clock_set_pll_cpu(800000000);
这两天把spi驱动搞了下,dual模式+提高spi速度,都没有很明显速度提升,有点奇怪,有个问题请教下,在刚启动的时候sys_copyself()是在flash里面运行的还是dram,在调用前没看到相关函数的拷贝过程,如果是在flash里面运行的,这里执行效率就相当低了。
Gardenia 说:达克罗德 说:framebuffer驱动我还是花了几个晚上功夫的,为了不用xboot的dts还有driver架构,把reset,clock等好几个模块都改了一遍。如果再来一遍V3S的话,应该容易很多,因为两芯片同出一源代码很类似。
不过不打算继续自己搞裸奔了,可重用性太低,累死人。准备直接用xboot或者RTOS这样的平台来开发后续产品,开发驱动有标准,代码容易复用,功能也更强大。比如说切换V3S和F1C100S对xboot来说非常简单,上层完全不用改
目前我把xboot优化到1.3MB大小(带文件系统和图形库),启动到logo只需要0.85s(F1C100S),基本满足需要。V3S没测,上电应该更快。如果V3S和F1C100S支持QSPI就完美了。。。
:lol:现在才看到,原来你已搞定,能分享下代码吗?我信息里面有我邮箱
我也想试试能不能启动之后能不能先初始化spi,提高下spi访问速度,之后spi拷贝速度会高点,没有qspi确实硬伤啊在老家,只能回去之后整理给你。
我试过把spi速度提高到100mhz,还有优化底层读fifo的代码,提升非常有限
800ms其中有400ms是全志内部boot代码读spl和启动的时间,这时候spi速度只有3mhz,这还没法改,没办法这是全志写死了。所以优化空间也不多了
楼主休完假了吧?我这边也是需要图形的,方便发我邮箱吗?4201842@qq.com
Gardenia 说:达克罗德 说:framebuffer驱动我还是花了几个晚上功夫的,为了不用xboot的dts还有driver架构,把reset,clock等好几个模块都改了一遍。如果再来一遍V3S的话,应该容易很多,因为两芯片同出一源代码很类似。
不过不打算继续自己搞裸奔了,可重用性太低,累死人。准备直接用xboot或者RTOS这样的平台来开发后续产品,开发驱动有标准,代码容易复用,功能也更强大。比如说切换V3S和F1C100S对xboot来说非常简单,上层完全不用改
目前我把xboot优化到1.3MB大小(带文件系统和图形库),启动到logo只需要0.85s(F1C100S),基本满足需要。V3S没测,上电应该更快。如果V3S和F1C100S支持QSPI就完美了。。。
:lol:现在才看到,原来你已搞定,能分享下代码吗?我信息里面有我邮箱
我也想试试能不能启动之后能不能先初始化spi,提高下spi访问速度,之后spi拷贝速度会高点,没有qspi确实硬伤啊在老家,只能回去之后整理给你。
我试过把spi速度提高到100mhz,还有优化底层读fifo的代码,提升非常有限
800ms其中有400ms是全志内部boot代码读spl和启动的时间,这时候spi速度只有3mhz,这还没法改,没办法这是全志写死了。所以优化空间也不多了
好的,非常感谢,那节后再说,图形库都带了850ms已经非常好了
Allwinner_F1C600_User_Manual_V1.0.pdf
293页:
DRM
Master Dual Mode RX Enable
0: RX use single-bit mode
1: RX use dual mode
Note:Can’t be written when XCH=1.
,又有新的希望了。
Gardenia 说:达克罗德 说:framebuffer驱动我还是花了几个晚上功夫的,为了不用xboot的dts还有driver架构,把reset,clock等好几个模块都改了一遍。如果再来一遍V3S的话,应该容易很多,因为两芯片同出一源代码很类似。
不过不打算继续自己搞裸奔了,可重用性太低,累死人。准备直接用xboot或者RTOS这样的平台来开发后续产品,开发驱动有标准,代码容易复用,功能也更强大。比如说切换V3S和F1C100S对xboot来说非常简单,上层完全不用改
目前我把xboot优化到1.3MB大小(带文件系统和图形库),启动到logo只需要0.85s(F1C100S),基本满足需要。V3S没测,上电应该更快。如果V3S和F1C100S支持QSPI就完美了。。。
:lol:现在才看到,原来你已搞定,能分享下代码吗?我信息里面有我邮箱
我也想试试能不能启动之后能不能先初始化spi,提高下spi访问速度,之后spi拷贝速度会高点,没有qspi确实硬伤啊没有quad spi,但是貌似有dual spi吧。
特地看了下手册,应该是不支持的
framebuffer驱动我还是花了几个晚上功夫的,为了不用xboot的dts还有driver架构,把reset,clock等好几个模块都改了一遍。如果再来一遍V3S的话,应该容易很多,因为两芯片同出一源代码很类似。
不过不打算继续自己搞裸奔了,可重用性太低,累死人。准备直接用xboot或者RTOS这样的平台来开发后续产品,开发驱动有标准,代码容易复用,功能也更强大。比如说切换V3S和F1C100S对xboot来说非常简单,上层完全不用改
目前我把xboot优化到1.3MB大小(带文件系统和图形库),启动到logo只需要0.85s(F1C100S),基本满足需要。V3S没测,上电应该更快。如果V3S和F1C100S支持QSPI就完美了。。。
:lol:现在才看到,原来你已搞定,能分享下代码吗?我信息里面有我邮箱
我也想试试能不能启动之后能不能先初始化spi,提高下spi访问速度,之后spi拷贝速度会高点,没有qspi确实硬伤啊
页次: 1