页次: 1
目前是基于xboot做的,系统关联性不强,FairyGUI那个群主要是说怎么用这个软件做游戏,至于实现方面说起来内容有点多。
1、首先做一个插件,识别FairyGUI里面生成的各种控件、动画属性,生成C代码
2、控件最小对象是图片,图片以各种组合方式,组成其他控件(比如图片文字,button、List、Menu等)
3、控件属性包含位置、大小、透明度、缩放比例、旋转角度等等
4、控件显示做成播放器方式,根据控件属性循环播放控件
5、动画实现根据FariyGUI导出的动画属性,加上时间戳,所以动画的播放只用将该动画属性时间戳归零(动画可多动画组合)
6、每一个界面以Screen为单位,每个Screen结构包含控件List、动画List等,切换界面只用播放器的全局Screen指针
7、最后晕哥传的视频,是添加了四叉树脏矩形算法,显示效率提高了接近2.5倍,原本全屏刷写约20帧多一点
达克罗德 wrote:
Gardenia wrote:
楼主休完假了吧?我这边也是需要图形的,方便发我邮箱吗?4201842@qq.com
我试了一下发现我的改动太分散,而且xboot和我另外一个框架绑在一起,不好给你,我还是给你说下几个改动吧
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
+#endif
Disable logs [arch/arm32/mach-f1c100s/include/configs.h]
+#define CONFIG_NO_LOG (1)
优化了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); > +#endif > > make 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里面运行的,这里执行效率就相当低了。
达克罗德 wrote:
Gardenia wrote:
达克罗德 wrote:
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
达克罗德 wrote:
Gardenia wrote:
达克罗德 wrote:
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已经非常好了
晕哥 wrote:
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.
,又有新的希望了。
路人甲 wrote:
Gardenia wrote:
达克罗德 wrote:
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吧。
特地看了下手册,应该是不支持的
达克罗德 wrote:
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