最近把xboot的几个驱动剥离了出来,特别是framebuffer,终于可以单独使用了
#if TEST_GPIO
gpio_f1c100s_set_dir(&GPIO_PE, 2, GPIO_DIRECTION_OUTPUT);
while(1)
{
gpio_f1c100s_set_value(&GPIO_PE, 2, 0);
gpio_f1c100s_set_value(&GPIO_PE, 2, 1);
}
#endif
#if TEST_FB
{
framebuffer_t fb_f1c100s;
fb_f1c100s_init(&fb_f1c100s);
render_t* render = fb_f1c100s_create(&fb_f1c100s);
for (int i = 0; i < render->pixlen/4;i++)
{
((uint32_t*)render->pixels)[i] = 0xFFFF0000;
}
fb_f1c100s_present(&fb_f1c100s, render);
fb_f1c100s_setbl(&fb_f1c100s, 100);
}
#endif
#if TEST_PWM
pwm_t led_pwm_bl =
{
.virt = 0x01c21000,
.duty = 50,
.period = 1000000,
.channel = 1,
.polarity = true,
.pwm_port = &GPIO_PE,
.pwm_pin = 6,
.pwm_pin_cfg = 3,
};
pwm_f1c100s_init(&led_pwm_bl);
#endif
编译:make
烧flash:make write
离线
要感谢xboot的原代码驱动!话说xboot是GNU license,以它的基础改的代码也应该开源。
另外xboot或者基于xboot改的代码能直接跑商业项目吗?按理得全部开源吧
离线
真的是好东西,再问一下,这个可以在V3S上跑么,如果要改大动,大概改哪里?谢谢。
离线
framebuffer驱动我还是花了几个晚上功夫的,为了不用xboot的dts还有driver架构,把reset,clock等好几个模块都改了一遍。如果再来一遍V3S的话,应该容易很多,因为两芯片同出一源代码很类似。
不过不打算继续自己搞裸奔了,可重用性太低,累死人。准备直接用xboot或者RTOS这样的平台来开发后续产品,开发驱动有标准,代码容易复用,功能也更强大。比如说切换V3S和F1C100S对xboot来说非常简单,上层完全不用改
目前我把xboot优化到1.3MB大小(带文件系统和图形库),启动到logo只需要0.85s(F1C100S),基本满足需要。V3S没测,上电应该更快。如果V3S和F1C100S支持QSPI就完美了。。。
离线
请问楼主你的 arm-eabi-gcc 是通过什么方式装到Linux 上面的?
我用 arm-none-linux-gnueabi-
make 后出错:
arm-none-linux-gnueabi-gcc -Imachine/include -Iarch/arm32/include -Idriver/include -Ilib -march=armv5te -mtune=arm926ej-s -mfloat-abi=soft -marm -mno-thumb-interwork -g -ggdb -Wall -O3 -ffreestanding -std=gnu99 -D__ARM32_ARCH__=5 -D__ARM926EJS__ -c -MD -o build/driver/fb-f1c100s.o driver/fb-f1c100s.c
In file included from /usr/local/arm-2014.05/arm-none-linux-gnueabi/libc/usr/include/stdlib.h:42:0,
from driver/fb-f1c100s.c:26:
/usr/local/arm-2014.05/arm-none-linux-gnueabi/libc/usr/include/bits/waitstatus.h:71:37: error: operator '==' has no right operand
# if __BYTE_ORDER == __LITTLE_ENDIAN
^
/usr/local/arm-2014.05/arm-none-linux-gnueabi/libc/usr/include/bits/waitstatus.h:86:37: error: operator '==' has no right operand
# if __BYTE_ORDER == __LITTLE_ENDIAN
^
make: *** [build/driver/fb-f1c100s.o] Error 1
离线
然后换 arm-linux-gnueabihf-gcc 还是一样的错误:
arm-linux-gnueabihf-gcc -Imachine/include -Iarch/arm32/include -Idriver/include -Ilib -march=armv5te -mtune=arm926ej-s -mfloat-abi=soft -marm -mno-thumb-interwork -g -ggdb -Wall -O3 -ffreestanding -std=gnu99 -D__ARM32_ARCH__=5 -D__ARM926EJS__ -c -MD -o build/driver/fb-f1c100s.o driver/fb-f1c100s.c
In file included from /usr/arm-linux-gnueabihf/include/stdlib.h:42:0,
from driver/fb-f1c100s.c:26:
/usr/arm-linux-gnueabihf/include/bits/waitstatus.h:71:37: error: operator '==' has no right operand
# if __BYTE_ORDER == __LITTLE_ENDIAN
^
/usr/arm-linux-gnueabihf/include/bits/waitstatus.h:86:37: error: operator '==' has no right operand
# if __BYTE_ORDER == __LITTLE_ENDIAN
^
make: *** [build/driver/fb-f1c100s.o] Error 1
离线
感觉你这个编译器不对,我是用xboot指定的5.3.1版
http://pan.baidu.com/s/1dDtssIt
离线
arm9没有hf的
离线
把 driver/fb-f1c100s.c 的 include <stdlib.h> 屏蔽起来,
上面的错误没有了,
新的链接错误:
root@ubuntu:~/minimal_f1c100s# make CROSS_COMPILE=arm-linux-gnueabi-
LINK build/firmware.elf
arm-linux-gnueabi-gcc -T f1c100s.ld -nostdlib -Wl,--cref,-Map=build/firmware.elf.map -o build/firmware.elf build/main.o build/machine/sys-clock.o build/machine/sys-dram.o build/machine/sys-uart.o build/machine/sys-copyself.o build/machine/sys-spi-flash.o build/machine/sys-mmu.o build/machine/exception.o build/driver/gpio-f1c100s.o build/driver/pwm-f1c100s.o build/driver/reset-f1c100s.o build/lib/malloc.o build/lib/dma.o build/driver/clk-f1c100s-pll.o build/driver/fb-f1c100s.o build/machine/start.o build/arch/arm32/lib/memcpy.o build/arch/arm32/lib/memset.o -lgcc
build/lib/malloc.o: In function `insert_free_block':
/root/minimal_f1c100s/lib/malloc.c:387: undefined reference to `__assert_fail'
/root/minimal_f1c100s/lib/malloc.c:393: undefined reference to `__assert_fail'
build/lib/malloc.o: In function `block_split':
/root/minimal_f1c100s/lib/malloc.c:424: undefined reference to `__assert_fail'
/root/minimal_f1c100s/lib/malloc.c:428: undefined reference to `__assert_fail'
/root/minimal_f1c100s/lib/malloc.c:426: undefined reference to `__assert_fail'
build/lib/malloc.o:/root/minimal_f1c100s/lib/malloc.c:461: more undefined references to `__assert_fail' follow
/usr/lib/gcc-cross/arm-linux-gnueabi/5/libgcc.a(_dvmd_lnx.o): In function `__aeabi_ldiv0':
(.text+0x8): undefined reference to `raise'
collect2: error: ld returned 1 exit status
Makefile:78: recipe for target 'build/firmware.elf' failed
make: *** [build/firmware.elf] Error 1
离线
感觉你这个编译器不对,我是用xboot指定的5.3.1版
http://pan.baidu.com/s/1dDtssIt
我试一试这个.
离线
离线
果然顺利编译完成.
但是烧进去之后,屏幕串口都没有反应,
而且再次进入 fel 模式,
说明应该是有问题的。
烧这个demo也一样:
https://whycan.cn/t_1393.html
最近编辑记录 awfans (2018-08-19 22:50:02)
离线
mksunxi tool编了吗?
最后几行应该会显示brom been fixed字样,Bootloader size=xxxx
离线
终于搞定,谢谢达哥, 红红的LCD亮起来了.
离线
终于搞定,谢谢达哥, 红红的LCD亮起来了.
问下你屏幕有条白线吗?我的有条白线,不知道是代码还有问题还是屏幕硬件有问题了
离线
我的是800x480的5寸屏,上面红红的,下面有一条灰色的,关电脑了,明天仔细看看。
离线
就是这样的,看起来也挺正常, 800x480
离线
https://whycan.cn/files/members/713/QQ20180821092612.jpg
就是这样的,看起来也挺正常, 800x480
下面怎么显示蓝色的?
离线
是呀,我也觉得好奇怪,屏幕是好的。
离线
:mad哈哈哈,多亏晕哥发现,太惭愧了,每次只要手填一堆数,总要出错。
离线
framebuffer驱动我还是花了几个晚上功夫的,为了不用xboot的dts还有driver架构,把reset,clock等好几个模块都改了一遍。如果再来一遍V3S的话,应该容易很多,因为两芯片同出一源代码很类似。
不过不打算继续自己搞裸奔了,可重用性太低,累死人。准备直接用xboot或者RTOS这样的平台来开发后续产品,开发驱动有标准,代码容易复用,功能也更强大。比如说切换V3S和F1C100S对xboot来说非常简单,上层完全不用改
目前我把xboot优化到1.3MB大小(带文件系统和图形库),启动到logo只需要0.85s(F1C100S),基本满足需要。V3S没测,上电应该更快。如果V3S和F1C100S支持QSPI就完美了。。。
xboot支持哪些文件系统?
看到有fatfs,其他几个不太了解,能不能支持ext2之类的呢
离线
不支持 ext2,自己移植才行吧
离线
arm-none-linux-gnueabi-gcc -Imachine/include -Iarch/arm32/include -Idriver/include -Ilib -march=armv5te -mtune=arm926ej-s -mfloat-abi=soft -marm -mno-thumb-interwork -g -ggdb -Wall -O3 -ffreestanding -std=gnu99 -D__ARM32_ARCH__=5 -D__ARM926EJS__ -c -MD -o build/driver/fb-f1c100s.o driver/fb-f1c100s.c
In file included from c:\baiduyundownload\arm-2014.05\arm-none-linux-gnueabi\libc\usr\include\stdlib.h:42:0,
from driver/fb-f1c100s.c:26:
c:\baiduyundownload\arm-2014.05\arm-none-linux-gnueabi\libc\usr\include\bits\waitstatus.h:71:37: error: operator '==' has no right operand
# if __BYTE_ORDER == __LITTLE_ENDIAN
^
c:\baiduyundownload\arm-2014.05\arm-none-linux-gnueabi\libc\usr\include\bits\waitstatus.h:86:37: error: operator '==' has no right operand
# if __BYTE_ORDER == __LITTLE_ENDIAN
^
make: *** [Makefile:104:build/driver/fb-f1c100s.o] 错误 1
这问题找到了,
$ arm-none-linux-gnueabi-gcc -E -dM - < /dev/null |grep ENDIAN
#define __ORDER_LITTLE_ENDIAN__ 1234
#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__
#define __ORDER_PDP_ENDIAN__ 3412
#define __ORDER_BIG_ENDIAN__ 4321
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
修改文件 waitstatus.h
__LITTLE_ENDIAN
__BIG_ENDIAN
改为:
__ORDER_LITTLE_ENDIAN__
__ORDER_BIG_ENDIAN__
在线
LINK build/firmware.elf
arm-none-linux-gnueabi-gcc -T f1c100s.ld -nostdlib -Wl,--cref,-Map=build/firmware.elf.map -o build/firmware.elf build/main.o build/machine/sys-clock.o build/machine/sys-dram.o build/machine/sys-uart.o build/machine/sys-copyself.o build/machine/sys-spi-flash.o build/machine/sys-mmu.o build/machine/exception.o build/driver/gpio-f1c100s.o build/driver/pwm-f1c100s.o build/driver/reset-f1c100s.o build/lib/malloc.o build/lib/dma.o build/driver/clk-f1c100s-pll.o build/driver/fb-f1c100s.o build/machine/start.o build/arch/arm32/lib/memcpy.o build/arch/arm32/lib/memset.o -lgcc -LD:\\Downloads\\arm-2014.05\\arm-none-linux-gnueabi\\libc\\armv4t\\usr\\lib\\ -lc
d:/downloads/arm-2014.05/bin/../lib/gcc/arm-none-linux-gnueabi/4.8.3\libgcc.a(bpabi.o):(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'
d:/downloads/arm-2014.05/bin/../lib/gcc/arm-none-linux-gnueabi/4.8.3\libgcc.a(_divdi3.o):(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'
d:/downloads/arm-2014.05/bin/../lib/gcc/arm-none-linux-gnueabi/4.8.3\libgcc.a(_udivdi3.o):(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'
d:/downloads/arm-2014.05/bin/../lib/gcc/arm-none-linux-gnueabi/4.8.3/../../../../arm-none-linux-gnueabi/bin/ld.exe: error: required section '.rel.plt' not found in the linker script
d:/downloads/arm-2014.05/bin/../lib/gcc/arm-none-linux-gnueabi/4.8.3/../../../../arm-none-linux-gnueabi/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status
make: *** [Makefile:79:build/firmware.elf] 错误 1
解决方案:
LIBS := -lgcc -LD:\\Downloads\\arm-2014.05\\arm-none-linux-gnueabi\\libc\\armv4t\\usr\\lib\\ -lc
https://stackoverflow.com/questions/18165527/linker-unable-to-find-assert-fail
在线
LINK build/firmware.elf
arm-none-linux-gnueabi-gcc -T f1c100s.ld -nostdlib -Wl,--cref,-Map=build/firmware.elf.map -o build/firmware.elf build/main.o build/machine/sys-clock.o build/machine/sys-dram.o build/machine/sys-uart.o build/machine/sys-copyself.o build/machine/sys-spi-flash.o build/machine/sys-mmu.o build/machine/exception.o build/driver/gpio-f1c100s.o build/driver/pwm-f1c100s.o build/driver/reset-f1c100s.o build/lib/malloc.o build/lib/dma.o build/driver/clk-f1c100s-pll.o build/driver/fb-f1c100s.o build/machine/start.o build/arch/arm32/lib/memcpy.o build/arch/arm32/lib/memset.o -lgcc -LD:\\Downloads\\arm-2014.05\\arm-none-linux-gnueabi\\libc\\armv4t\\usr\\lib\\ -lc
d:/downloads/arm-2014.05/bin/../lib/gcc/arm-none-linux-gnueabi/4.8.3\libgcc.a(bpabi.o):(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'
d:/downloads/arm-2014.05/bin/../lib/gcc/arm-none-linux-gnueabi/4.8.3\libgcc.a(_divdi3.o):(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'
d:/downloads/arm-2014.05/bin/../lib/gcc/arm-none-linux-gnueabi/4.8.3\libgcc.a(_udivdi3.o):(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'
d:/downloads/arm-2014.05/bin/../lib/gcc/arm-none-linux-gnueabi/4.8.3/../../../../arm-none-linux-gnueabi/bin/ld.exe: error: required section '.rel.plt' not found in the linker script
d:/downloads/arm-2014.05/bin/../lib/gcc/arm-none-linux-gnueabi/4.8.3/../../../../arm-none-linux-gnueabi/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status
make: *** [Makefile:79:build/firmware.elf] 错误 1
解决方案:
添加一个空函数:
/* Dummy function to avoid linker complaints */
void __aeabi_unwind_cpp_pr0(void)
{};
在线
$ make CROSS_COMPILE=arm-none-linux-gnueabi-
LINK build/firmware.elf
arm-none-linux-gnueabi-gcc -T f1c100s.ld -nostdlib -Wl,--cref,-Map=build/firmware.elf.map -o build/firmware.elf build/main.o build/machine/sys-clock.o build/machine/sys-dram.o build/machine/sys-uart.o build/machine/sys-copyself.o build/machine/sys-spi-flash.o build/machine/sys-mmu.o build/machine/exception.o build/driver/gpio-f1c100s.o build/driver/pwm-f1c100s.o build/driver/reset-f1c100s.o build/lib/malloc.o build/lib/dma.o build/driver/clk-f1c100s-pll.o build/driver/fb-f1c100s.o build/machine/start.o build/arch/arm32/lib/memcpy.o build/arch/arm32/lib/memset.o -lgcc -LD:\\Downloads\\arm-2014.05\\arm-none-linux-gnueabi\\libc\\armv4t\\usr\\lib\\ -lc
d:/downloads/arm-2014.05/bin/../lib/gcc/arm-none-linux-gnueabi/4.8.3/../../../../arm-none-linux-gnueabi/bin/ld.exe: error: required section '.rel.plt' not found in the linker script
d:/downloads/arm-2014.05/bin/../lib/gcc/arm-none-linux-gnueabi/4.8.3/../../../../arm-none-linux-gnueabi/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status
make: *** [Makefile:79:build/firmware.elf] 错误 1
最后一个链接错误,不知道怎么改了
看来还是用 xboot 提供的 toolchain 比较顺利
arm-eabi-gcc -x assembler-with-cpp -march=armv5te -mtune=arm926ej-s -mfloat-abi=soft -marm -mno-thumb-interwork -g -ggdb -Wall -O3 -ffreestanding -std=gnu99 -D__ARM32_ARCH__=5 -D__ARM926EJS__ -c -o build/arch/arm32/lib/memset.o arch/arm32/lib/memset.S
LINK build/firmware.elf
arm-eabi-gcc -T f1c100s.ld -nostdlib -Wl,--cref,-Map=build/firmware.elf.map -o build/firmware.elf build/main.o build/machine/sys-clock.o build/machine/sys-dram.o build/machine/sys-uart.o build/machine/sys-copyself.o build/machine/sys-spi-flash.o build/machine/sys-mmu.o build/machine/exception.o build/driver/gpio-f1c100s.o build/driver/pwm-f1c100s.o build/driver/reset-f1c100s.o build/lib/malloc.o build/lib/dma.o build/driver/clk-f1c100s-pll.o build/driver/fb-f1c100s.o build/machine/start.o build/arch/arm32/lib/memcpy.o build/arch/arm32/lib/memset.o -lgcc
arm-eabi-size build/firmware.elf
text data bss dec hex filename
28076 92 524424 552592 86e90 build/firmware.elf
arm-eabi-objcopy -v -O binary build/firmware.elf build/firmware.bin
copy from `build/firmware.elf' [elf32-littlearm] to `build/firmware.bin' [binary]
在线
编译器差别这么大呀。。。
我都想用llvm了,公司用的就是llvm
离线
感谢LZ分享:D
离线
牛,framebuffer好了,图片能支持PNG吗?bmp太占空间了。
离线
Gardenia 说:牛,framebuffer好了,图片能支持PNG吗?bmp太占空间了。
移植一个 libpng 就支持 png图片了。
xboot本身就集成了 libpng.
嗯,看到了,xboot启动时间比较慢,如果要做到1秒以内启动,晕哥有没试过?有可行性不?
离线
晕哥 说:Gardenia 说:牛,framebuffer好了,图片能支持PNG吗?bmp太占空间了。
移植一个 libpng 就支持 png图片了。
xboot本身就集成了 libpng.
嗯,看到了,xboot启动时间比较慢,如果要做到1秒以内启动,晕哥有没试过?有可行性不?
主要耗时在于spl(boot0)从spi 拷贝 xboot(boot1) 到DRAM,
想办法精简 xboot, 或者分时加载 xboot, 比如再弄个boot2, 系统boot1启动后再加载boot2.
在线
Gardenia 说:晕哥 说:移植一个 libpng 就支持 png图片了。
xboot本身就集成了 libpng.
嗯,看到了,xboot启动时间比较慢,如果要做到1秒以内启动,晕哥有没试过?有可行性不?
主要耗时在于spl(boot0)从spi 拷贝 xboot(boot1) 到DRAM,
想办法精简 xboot, 或者分时加载 xboot, 比如再弄个boot2, 系统boot1启动后再加载boot2.
好的,谢谢,我试试看。
离线
晕哥 说:Gardenia 说:嗯,看到了,xboot启动时间比较慢,如果要做到1秒以内启动,晕哥有没试过?有可行性不?
主要耗时在于spl(boot0)从spi 拷贝 xboot(boot1) 到DRAM,
想办法精简 xboot, 或者分时加载 xboot, 比如再弄个boot2, 系统boot1启动后再加载boot2.好的,谢谢,我试试看。
我做到800ms,主要是把romdisk裁剪了一点,把log关掉,不用的函数关掉,autoboot的一秒等待关掉,基本就差不多了。不要用压缩
离线
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确实硬伤啊
最近编辑记录 Gardenia (2018-10-01 09:24:35)
离线
达克罗德 说: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吧。
离线
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吧。
特地看了下手册,应该是不支持的
离线
在线
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.
,又有新的希望了。
离线
达克罗德 说: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,这还没法改,没办法这是全志写死了。所以优化空间也不多了
离线
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已经非常好了
离线
目前我把xboot优化到1.3MB大小(带文件系统和图形库),启动到logo只需要0.85s(F1C100S),基本满足需要。V3S没测,上电应该更快。如果V3S和F1C100S支持QSPI就完美了。。。
我这里不带文件系统和图形库,只保留要用的功能和驱动,xboot可优化到240kB。很实用了。
对于很多应用,数据文件应该占ROM空间很大一部分。xboot把数据文件打包放在romdisk里,也会占用启动拷贝Flash的时间。这部分是可以优化成在启动之后做的。
离线
达克罗德 说:目前我把xboot优化到1.3MB大小(带文件系统和图形库),启动到logo只需要0.85s(F1C100S),基本满足需要。V3S没测,上电应该更快。如果V3S和F1C100S支持QSPI就完美了。。。
我这里不带文件系统和图形库,只保留要用的功能和驱动,xboot可优化到240kB。很实用了。
对于很多应用,数据文件应该占ROM空间很大一部分。xboot把数据文件打包放在romdisk里,也会占用启动拷贝Flash的时间。这部分是可以优化成在启动之后做的。
厉害厉害,能不能分享一下?
离线
厉害厉害,能不能分享一下?
开新帖分享了裁剪方法,把XBOOT优化到<170kB了。https://whycan.cn/t_1708.html
离线
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
离线
楼主休完假了吧?我这边也是需要图形的,方便发我邮箱吗?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
+#endif
2. 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);
离线
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 (2018-10-10 21:08:19)
离线
达克罗德 说: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里面运行的,这里执行效率就相当低了。
全志的brom程序启动时自动从spi nor拷贝最前面的几k代码到内部SRAM后执行的。后来因为SRAM太慢,xboot老大又改成再一次拷贝到dram后再从dram执行copyself,把整个image拷贝到DRAM
离线
谢谢,了解了,按你的改了又有些提升,目前效果还不错,谢谢楼主。
离线
这玩意的性能,裸奔还是蛮有玩头的
离线
裸奔?好多库不能用呢?
离线
裸奔?好多库不能用呢?
需要什么库
离线
楼主位的外设驱动代码(spi iic uasrt等),都验证可用的吗?
离线
请教,楼主位的framebuffer,有没有画点函数?
离线
请教,楼主位的framebuffer,有没有画点函数?
framebuffer都有了,画点就是把rgba写到对应行列的那个32位数
离线
Pese 说:请教,楼主位的framebuffer,有没有画点函数?
framebuffer都有了,画点就是把rgba写到对应行列的那个32位数
这样?下载麻烦未测试
void point(x,y,color){
((uint32_t *)render->pixels)[x+800*y] = color;
fb_f1c100s_present(&fb_f1c100s, render);
}
不过裸机真的麻烦,使用了标准库,makefile加-lc -lm -lnosys编译,就报错,外设驱动又不全,玩不来啊
In function `_sbrk':
sbrk.c:(.text._sbrk+0x28): undefined reference to `end'
collect2.exe: error: ld returned 1 exit status
噢gcc是gcc version 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907] (GNU Tools for Arm Embedded Processors 7-2018-q2-update)
离线
达克罗德 说:Pese 说:请教,楼主位的framebuffer,有没有画点函数?
framebuffer都有了,画点就是把rgba写到对应行列的那个32位数
这样?下载麻烦未测试
void point(x,y,color){
((uint32_t *)render->pixels)[x+800*y] = color;
fb_f1c100s_present(&fb_f1c100s, render);
}
不过裸机真的麻烦,使用了标准库,makefile加-lc -lm -lnosys编译,就报错,外设驱动又不全,玩不来啊
In function `_sbrk':
sbrk.c:(.text._sbrk+0x28): undefined reference to `end'
collect2.exe: error: ld returned 1 exit status
噢gcc是gcc version 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907] (GNU Tools for Arm Embedded Processors 7-2018-q2-update)
present是把全屏都更新。你不要每画一个点都更新全屏,而是全部画完才调present
离线
Pese 说:达克罗德 说:framebuffer都有了,画点就是把rgba写到对应行列的那个32位数
这样?下载麻烦未测试
void point(x,y,color){
((uint32_t *)render->pixels)[x+800*y] = color;
fb_f1c100s_present(&fb_f1c100s, render);
}
不过裸机真的麻烦,使用了标准库,makefile加-lc -lm -lnosys编译,就报错,外设驱动又不全,玩不来啊
In function `_sbrk':
sbrk.c:(.text._sbrk+0x28): undefined reference to `end'
collect2.exe: error: ld returned 1 exit status
噢gcc是gcc version 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907] (GNU Tools for Arm Embedded Processors 7-2018-q2-update)present是把全屏都更新。你不要每画一个点都更新全屏,而是全部画完才调present
折腾一下,还是不行,不知道为什么,这是什么原因?
代码和显示如下(按代码应该是有一条绿线的)
离线
达克罗德 说:Pese 说:这样?下载麻烦未测试
void point(x,y,color){
((uint32_t *)render->pixels)[x+800*y] = color;
fb_f1c100s_present(&fb_f1c100s, render);
}
不过裸机真的麻烦,使用了标准库,makefile加-lc -lm -lnosys编译,就报错,外设驱动又不全,玩不来啊
In function `_sbrk':
sbrk.c:(.text._sbrk+0x28): undefined reference to `end'
collect2.exe: error: ld returned 1 exit status
噢gcc是gcc version 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907] (GNU Tools for Arm Embedded Processors 7-2018-q2-update)present是把全屏都更新。你不要每画一个点都更新全屏,而是全部画完才调present
折腾一下,还是不行,不知道为什么,这是什么原因?
代码和显示如下(按代码应该是有一条绿线的)
https://whycan.cn/files/members/377/1.png
https://whycan.cn/files/members/377/3.jpg
很奇怪,你全屏画蓝色都可以,没理由画一行不行呀。晕哥发现的我在驱动把480写成400这个问题你改了吗?
离线
Pese 说:达克罗德 说:present是把全屏都更新。你不要每画一个点都更新全屏,而是全部画完才调present
折腾一下,还是不行,不知道为什么,这是什么原因?
代码和显示如下(按代码应该是有一条绿线的)
https://whycan.cn/files/members/377/1.png
https://whycan.cn/files/members/377/3.jpg很奇怪,你全屏画蓝色都可以,没理由画一行不行呀。晕哥发现的我在驱动把480写成400这个问题你改了吗?
改了,所以看到的是全屏蓝色的,奇怪的是全屏刷一个颜色就可以,可这样画线或画一个矩形,就不行,你有空试试上面画线的代码看看!!
离线
改了,所以看到的是全屏蓝色的,奇怪的是全屏刷一个颜色就可以,可这样画线或画一个矩形,就不行,你有空试试上面画线的代码看看!!
原来是我的Bug,defe和debe的divider没有设对。PLL时钟要用f1c100s_tcon_clk_get_rate()来获取,主要是改动一下两个地方:
static void f1c100s_clk_defe_init(void)
{
clk_mux_set_parent(0x01c2010c, 3, 24, 0);
clk_divider_set_rate(0x01c2010c, 4, 0, true, f1c100s_tcon_clk_get_rate(), 198000000);
}
static void f1c100s_clk_debe_init(void)
{
clk_mux_set_parent(0x01c20104, 3, 24, 0);
clk_divider_set_rate(0x01c20104, 4, 0, true, f1c100s_tcon_clk_get_rate(), 198000000);
}
main
framebuffer_t fb_f1c100s;
fb_f1c100s_init(&fb_f1c100s);
render_t* render = fb_f1c100s_create(&fb_f1c100s);
for (int i = 0; i < render->pixlen/4;i++)
{
((uint32_t*)render->pixels)[i] = 0xFF0000FF;
}
fb_f1c100s_present(&fb_f1c100s, render);
for (int i = 0; i < 800;i++)
{
((uint32_t*)render->pixels)[i+80000] = 0xFF00FF00;
}
fb_f1c100s_present(&fb_f1c100s, render);
fb_f1c100s_setbl(&fb_f1c100s, 100);
离线
讨论好激烈, 拍照合影留念!
离线
改了,所以看到的是全屏蓝色的,奇怪的是全屏刷一个颜色就可以,可这样画线或画一个矩形,就不行,你有空试试上面画线的代码看看!!
原来是我的Bug,defe和debe的divider没有设对。PLL时钟要用f1c100s_tcon_clk_get_rate()来获取,主要是改动一下两个地方:
static void f1c100s_clk_defe_init(void) { clk_mux_set_parent(0x01c2010c, 3, 24, 0); clk_divider_set_rate(0x01c2010c, 4, 0, true, f1c100s_tcon_clk_get_rate(), 198000000); } static void f1c100s_clk_debe_init(void) { clk_mux_set_parent(0x01c20104, 3, 24, 0); clk_divider_set_rate(0x01c20104, 4, 0, true, f1c100s_tcon_clk_get_rate(), 198000000); }
main
framebuffer_t fb_f1c100s; fb_f1c100s_init(&fb_f1c100s); render_t* render = fb_f1c100s_create(&fb_f1c100s); for (int i = 0; i < render->pixlen/4;i++) { ((uint32_t*)render->pixels)[i] = 0xFF0000FF; } fb_f1c100s_present(&fb_f1c100s, render); for (int i = 0; i < 800;i++) { ((uint32_t*)render->pixels)[i+80000] = 0xFF00FF00; } fb_f1c100s_present(&fb_f1c100s, render); fb_f1c100s_setbl(&fb_f1c100s, 100);
厉害了!!
离线
嘿嘿,过两天试试 ~~
离线
支持一下, 之前搞了很长时间,可以只搞出一半来,这次有完整的了
离线
在大佬的裸机代码基础上移植了ZLG_GUI并显示了旋转立方体。
可惜大佬没写例子的外设都还没摸索会,不然就多加点功能了。
另外,我想以此写一篇新手裸机教程,可以吗?
离线
这个Demo真是666,这个是gif的吗,是不是用zlg gui模拟器导出的gif,方便分享代码吗?
离线
这个Demo真是666,这个是gif的吗,是不是用zlg gui模拟器导出的gif,方便分享代码吗?
想多了,这个是荔枝派屏幕显示,手机拍下来,然后软件转成GIF的,图像质量一下降,颜色都没了,不好看了。
但这个的demo我已经写了教程,在博客园,有源码。 https://www.cnblogs.com/zhinianzhizhan/p/10051013.html 。
就是在荔枝派Nano上面移植显示的,要的话拿去。不过没有你说的GUI自己导出GIF的功能........它没有那么高级,图片显示函数都要自己写,简单的菜单等功能倒是能实现,虽然丑了点。而且我不清楚这个GUI是否免费,纯粹拿来玩。如果你想要你说的功能,得自己写或另外移植支持此功能的GUI了。另外,驱动代码就是本帖子的大神的作品,希望楼主允许。
最近编辑记录 执念执战 (2018-12-02 15:12:51)
离线
basicdev 说:这个Demo真是666,这个是gif的吗,是不是用zlg gui模拟器导出的gif,方便分享代码吗?
想多了,这个是荔枝派屏幕显示,手机拍下来,然后软件转成GIF的,图像质量一下降,颜色都没了,不好看了。
但这个的demo我已经写了教程,在博客园,有源码。 https://www.cnblogs.com/zhinianzhizhan/p/10051013.html 。
就是在荔枝派Nano上面移植显示的,要的话拿去。不过没有你说的GUI自己导出GIF的功能........它没有那么高级,图片显示函数都要自己写,简单的菜单等功能倒是能实现,虽然丑了点。而且我不清楚这个GUI是否免费,纯粹拿来玩。如果你想要你说的功能,得自己写或另外移植支持此功能的GUI了。另外,驱动代码就是本帖子的大神的作品,希望楼主允许。
感谢解惑, 拜读了你的帖子,简直就是小白从入门到精通啊,还提供源码下载。
离线
执念执战 说:basicdev 说:这个Demo真是666,这个是gif的吗,是不是用zlg gui模拟器导出的gif,方便分享代码吗?
想多了,这个是荔枝派屏幕显示,手机拍下来,然后软件转成GIF的,图像质量一下降,颜色都没了,不好看了。
但这个的demo我已经写了教程,在博客园,有源码。 https://www.cnblogs.com/zhinianzhizhan/p/10051013.html 。
就是在荔枝派Nano上面移植显示的,要的话拿去。不过没有你说的GUI自己导出GIF的功能........它没有那么高级,图片显示函数都要自己写,简单的菜单等功能倒是能实现,虽然丑了点。而且我不清楚这个GUI是否免费,纯粹拿来玩。如果你想要你说的功能,得自己写或另外移植支持此功能的GUI了。另外,驱动代码就是本帖子的大神的作品,希望楼主允许。感谢解惑, 拜读了你的帖子,简直就是小白从入门到精通啊,还提供源码下载。
实在是因为荔枝派吃灰太久,突然有大佬弄了个能入门的东西,所以想让其他还没入门的也感受一下。而且这些都是单片机思维的东西,一般的接触起来也简单。以后学一下更高级的东西再写移植这个立方体的教程。当然,如果楼主能放出点各个驱动的简单使用代码,我还打算弄个小掌机,基于这个3D显示写点小游戏,来更加深入的写点入门帖。可惜,人家能写出来源码,我都不会用,这个差距一下子就出来了......
离线
basicdev 说:执念执战 说:想多了,这个是荔枝派屏幕显示,手机拍下来,然后软件转成GIF的,图像质量一下降,颜色都没了,不好看了。
但这个的demo我已经写了教程,在博客园,有源码。 https://www.cnblogs.com/zhinianzhizhan/p/10051013.html 。
就是在荔枝派Nano上面移植显示的,要的话拿去。不过没有你说的GUI自己导出GIF的功能........它没有那么高级,图片显示函数都要自己写,简单的菜单等功能倒是能实现,虽然丑了点。而且我不清楚这个GUI是否免费,纯粹拿来玩。如果你想要你说的功能,得自己写或另外移植支持此功能的GUI了。另外,驱动代码就是本帖子的大神的作品,希望楼主允许。感谢解惑, 拜读了你的帖子,简直就是小白从入门到精通啊,还提供源码下载。
实在是因为荔枝派吃灰太久,突然有大佬弄了个能入门的东西,所以想让其他还没入门的也感受一下。而且这些都是单片机思维的东西,一般的接触起来也简单。以后学一下更高级的东西再写移植这个立方体的教程。当然,如果楼主能放出点各个驱动的简单使用代码,我还打算弄个小掌机,基于这个3D显示写点小游戏,来更加深入的写点入门帖。可惜,人家能写出来源码,我都不会用,这个差距一下子就出来了......
感谢 @执念执战 这么细致入微的入门教程, 感谢移植这么漂亮的ZLG GUI。
@执念执战分享的代码:
minimal_f1c100s_framebuffer_zlggui.rar
我在linux下编译的时候有整数类型定义错误,所以稍稍改了一下通过编译: minimal_f1c100s_fb_zlggui.tgz
我换上了4.3寸液晶体验了一把:
在线
裸奔要做成stm32f103那样的标准库方式才好统一研究
离线
学习
离线
大侠,我编译的时候出现mksunxi无法编译,还请问大概是什么情况。
我已经使用root用户来编译了,还提示没有权限。
离线
大侠,我编译的时候出现mksunxi无法编译,还请问大概是什么情况。
我已经使用root用户来编译了,还提示没有权限。
https://whycan.cn/files/members/1297/minimal_f1c100s.jpg
没遇到过,你试试把sunxitool的可执行文件用chmod 777处理下
离线
原来是tools/mksunxi/mksunxi没有执行权限。多谢指点。
离线
编译完的firmware.bin文件可以从SD卡里运行吗?还是必须要烧到flash中?
离线
各位真牛逼,吾等在此膜拜!
离线
ce-f1c100s-timer.c和cs-f1c100s-timer.c这两个有什么区别?
离线
我想买一款F1C200S的产品拆解一下,求产品链接。
离线
不错受到鼓舞 正在做nuc972的显示代码一天了还没头绪。
离线
A
AAAAAAAAAAAA
离线
学习了
离线
首先感谢楼主的贡献,源码在荔枝派F1C100S板上顺利的跑起来了。
下面有个问题想请教下:
我想修改液晶驱动函数,改成1024*768分辨率,通过VGA驱动15寸液晶屏。
VGA时序参考了 https://www.cnblogs.com/qidaiymm/p/6006039.html ,http://www.docin.com/p-540410877.html 查看了相关的VGA标准时序。修改了液晶初始化函数,但是一直不成功,不知道 除了 VGA的时序需要修改,还有那些参数需要修改?
代码如下:
void fb_f1c100s_init(framebuffer_t * fb)
{
int32_t i;
fb_f1c100s_pdata_t * pdat = &fb_f1c100s_pData;
pdat->virtdefe = phys_to_virt(F1C100S_DEFE_BASE);
pdat->virtdebe = phys_to_virt(F1C100S_DEBE_BASE);
pdat->virttcon = phys_to_virt(F1C100S_TCON_BASE);
pdat->clkdefe = "clkdefe";
pdat->clkdebe = "clkdebe";
pdat->clktcon = "clktcon";
pdat->rstdefe = 46; //请问这里是是什么参数?
pdat->rstdebe = 44; //请问这里是是什么参数?
pdat->rsttcon = 36; //请问达克罗德这里是是什么参数?
pdat->width = 1024; //分辨率
pdat->height = 768;
pdat->pwidth = 136; //h-pulse-width 水平脉冲宽度
pdat->pheight = 6; // v-pulse-width 垂直脉冲宽度
pdat->bits_per_pixel = 18;
pdat->bytes_per_pixel = 4;
pdat->index = 0;
pdat->vram[0] = dma_alloc_noncoherent(pdat->width * pdat->height * pdat->bytes_per_pixel);
pdat->vram[1] = dma_alloc_noncoherent(pdat->width * pdat->height * pdat->bytes_per_pixel);
pdat->timing.pixel_clock_hz = 65000000; //65MHZ 时钟
pdat->timing.h_front_porch = 24; //水平前沿值
pdat->timing.h_back_porch = 160; // //水平后沿值
pdat->timing.h_sync_len = 1344; //
pdat->timing.v_front_porch = 3; //垂直前沿值
pdat->timing.v_back_porch = 29; //垂直后沿值
pdat->timing.v_sync_len = 806;
pdat->timing.h_sync_active = false;
pdat->timing.v_sync_active = false;
pdat->timing.den_active = false;
pdat->timing.clk_active = false;
pdat->backlight = &led_pwm_bl;
fb->name = "fb-f1c100s";
fb->width = pdat->width;
fb->height = pdat->height;
fb->pwidth = pdat->pwidth;
fb->pheight = pdat->pheight;
fb->bpp = pdat->bytes_per_pixel * 8;
fb->priv = pdat;
f1c100s_clk_pll_video_set_enable(true);
f1c100s_clk_debe_init();
f1c100s_clk_defe_init();
f1c100s_clk_tcon_init();
// clk_enable(pdat->clkdefe);
// clk_enable(pdat->clkdebe);
// clk_enable(pdat->clktcon);
f1c100s_clk_defe_enable();
f1c100s_clk_debe_enable();
f1c100s_clk_tcon_enable();
if(pdat->rstdefe >= 0)
reset_f1c100s_deassert(&reset_2, pdat->rstdefe - reset_2.base);
if(pdat->rstdebe >= 0)
reset_f1c100s_deassert(&reset_2, pdat->rstdebe - reset_2.base);
if(pdat->rsttcon >= 0)
reset_f1c100s_deassert(&reset_2, pdat->rsttcon - reset_2.base);
for(i = 0x0800; i < 0x1000; i += 4)
write32(pdat->virtdebe + i, 0);
fb_f1c100s_init_hw(pdat);
}
网址的fb-f1c100s.c文件下载 fb-f1c100s.zip
离线
那是几个显示相关模块的内部复位管,和时序没什么关系
离线
你好,达克罗德
我在修改液framebuffer初始化函数的时候,void fb_f1c100s_init(framebuffer_t * fb)函数中,只要修改了频率参数, 您的代码中 原来pdat->timing.pixel_clock_hz = 33000000 ,只要这个参数一旦修改后,不管是变大还是变小。 F1C100S的LCD_CLK硬件引脚就没有信号输出了。
我尝试了下,查询液晶初始化的其他函数,实在没有发现问题所在。
请问下达克罗德,您的代码从XBOOT中移植出来,是否需要修改什么地方,才可以 实现其他分辨率的刷屏频率。
离线
你好,达克罗德
我在修改液framebuffer初始化函数的时候,void fb_f1c100s_init(framebuffer_t * fb)函数中,只要修改了频率参数, 您的代码中 原来pdat->timing.pixel_clock_hz = 33000000 ,只要这个参数一旦修改后,不管是变大还是变小。 F1C100S的LCD_CLK硬件引脚就没有信号输出了。
我尝试了下,查询液晶初始化的其他函数,实在没有发现问题所在。
请问下达克罗德,您的代码从XBOOT中移植出来,是否需要修改什么地方,才可以 实现其他分辨率的刷屏频率。
71楼的修改你改了吗
我最近要支持1024x600,成功了我发出来
离线
你好,达克罗德。
我的工程替换了71楼的 “完整FB-f1c100s.c文件”,编译成功后,修改pdat->timing.pixel_clock_hz ,情况是一样的,LCD_CLK硬件引脚就没有信号输出。
离线
你好,达克罗德。
我的工程替换了71楼的 “完整FB-f1c100s.c文件”,编译成功后,修改pdat->timing.pixel_clock_hz ,情况是一样的,LCD_CLK硬件引脚就没有信号输出。
启动时PLL_VIDEO时钟只有198MHZ,而全志要求和pixel时钟的倍数必须大于等于4,实际我发现大于等于6才行。所以33Mhz以上TCON时钟工作不正常
需要把PLL video时钟设高一点
把sys_clock.c中
write32(F1C100S_CCU_BASE + CCU_PLL_VIDEO_CTRL, 0x81004107);
时钟输出=24000000*(0x41+1)/(0x07+1)=198Mhz
改为
write32(F1C100S_CCU_BASE + CCU_PLL_VIDEO_CTRL, 0x81004103);
时钟输出=24000000*(0x41+1)/(0x03+1)=396Mhz
这时候pixel_clock_hz能设置成更高时钟了
离线
有usb开源资料就爽了
离线
0752ben 说:你好,达克罗德。
我的工程替换了71楼的 “完整FB-f1c100s.c文件”,编译成功后,修改pdat->timing.pixel_clock_hz ,情况是一样的,LCD_CLK硬件引脚就没有信号输出。启动时PLL_VIDEO时钟只有198MHZ,而全志要求和pixel时钟的倍数必须大于等于4,实际我发现大于等于6才行。所以33Mhz以上TCON时钟工作不正常
需要把PLL video时钟设高一点
把sys_clock.c中write32(F1C100S_CCU_BASE + CCU_PLL_VIDEO_CTRL, 0x81004107);
时钟输出=24000000*(0x41+1)/(0x07+1)=198Mhz
改为write32(F1C100S_CCU_BASE + CCU_PLL_VIDEO_CTRL, 0x81004103);
时钟输出=24000000*(0x41+1)/(0x03+1)=396Mhz
这时候pixel_clock_hz能设置成更高时钟了
你好,达克罗德,我还是没能调通1280*720分辨率输出。上个月忙起来,就没有时间研究了。请问您接付费外包吗?我的联系方式邮箱 243280383@qq.com
离线
达克罗德 说:0752ben 说:你好,达克罗德。
我的工程替换了71楼的 “完整FB-f1c100s.c文件”,编译成功后,修改pdat->timing.pixel_clock_hz ,情况是一样的,LCD_CLK硬件引脚就没有信号输出。启动时PLL_VIDEO时钟只有198MHZ,而全志要求和pixel时钟的倍数必须大于等于4,实际我发现大于等于6才行。所以33Mhz以上TCON时钟工作不正常
需要把PLL video时钟设高一点
把sys_clock.c中write32(F1C100S_CCU_BASE + CCU_PLL_VIDEO_CTRL, 0x81004107);
时钟输出=24000000*(0x41+1)/(0x07+1)=198Mhz
改为write32(F1C100S_CCU_BASE + CCU_PLL_VIDEO_CTRL, 0x81004103);
时钟输出=24000000*(0x41+1)/(0x03+1)=396Mhz
这时候pixel_clock_hz能设置成更高时钟了
你好,达克罗德,我还是没能调通1280*720分辨率输出。上个月忙起来,就没有时间研究了。请问您接付费外包吗?我的联系方式邮箱 243280383@qq.com
不好意思,实在没有时间,我只是业余玩玩,研究也很浅
离线
达克罗德,谢谢你的回复
离线
这种级别芯片跑裸奔实在太累了
离线
你好!定时器中断和UART中断试过吗?串口初始化时加了 接收中断
val = read32(addr + 0X04);
write32(addr + 0x04, val|0x01);
T0定时器按晕哥的MDK裸奔配置了,,
但老是没反应,,,是配置错吗?中断是在arm32_do_irq中处理吗?还有什么要修改?
离线
非常好。
这个是裸机的,请问想在 RT-Thread上跑,启动文件和链接文件该怎么修改?
下面这个是RT-Thread官方写的,项目地址:https://github.com/RT-Thread/rt-thread/tree/master/bsp/allwinner_tina
只能在内存里跑,不能从flash启动。
方法如下:
sudo sunxi-fel -p write 0x00000000 tina-spl.bin
sudo sunxi-fel exec 0x00000000
sudo sunxi-fel -p write 0x80000000 rtthread.bin
sudo sunxi-fel exec 0x80000000
tina-spl.bin是由开源项目https://github.com/uestczyh222/tina-spl.git 编译得到的bin文件。
start_gcc.S:
/*
* File : start_gcc.S
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2013-2018, RT-Thread Development Team
*/
.equ MODE_USR, 0x10
.equ MODE_FIQ, 0x11
.equ MODE_IRQ, 0x12
.equ MODE_SVC, 0x13
.equ MODE_ABT, 0x17
.equ MODE_UND, 0x1B
.equ MODE_SYS, 0x1F
.equ MODEMASK, 0x1F
.equ NOINT, 0xC0
.equ I_BIT, 0x80
.equ F_BIT, 0x40
.equ UND_STACK_SIZE, 0x00000100
.equ SVC_STACK_SIZE, 0x00000100
.equ ABT_STACK_SIZE, 0x00000100
.equ FIQ_STACK_SIZE, 0x00000100
.equ IRQ_STACK_SIZE, 0x00000100
.equ SYS_STACK_SIZE, 0x00000100
/*
***************************************
* Interrupt vector table
***************************************
*/
.section .vectors
.code 32
.global system_vectors
system_vectors:
ldr pc, _vector_reset
ldr pc, _vector_undef
ldr pc, _vector_swi
ldr pc, _vector_pabt
ldr pc, _vector_dabt
ldr pc, _vector_resv
ldr pc, _vector_irq
ldr pc, _vector_fiq
_vector_reset:
.word reset
_vector_undef:
.word vector_undef
_vector_swi:
.word SVC_Handler
_vector_pabt:
.word vector_pabt
_vector_dabt:
.word vector_dabt
_vector_resv:
.word vector_resv
_vector_irq:
.word vector_irq
_vector_fiq:
.word vector_fiq
.balignl 16,0xdeadbeef
/*
***************************************
* Stack and Heap Definitions
***************************************
*/
.section .data
.space UND_STACK_SIZE
.align 3
.global und_stack_start
und_stack_start:
.space ABT_STACK_SIZE
.align 3
.global abt_stack_start
abt_stack_start:
.space FIQ_STACK_SIZE
.align 3
.global fiq_stack_start
fiq_stack_start:
.space IRQ_STACK_SIZE
.align 3
.global irq_stack_start
irq_stack_start:
.skip SYS_STACK_SIZE
.align 3
.global sys_stack_start
sys_stack_start:
.space SVC_STACK_SIZE
.align 3
.global svc_stack_start
svc_stack_start:
/*
***************************************
* Startup Code
***************************************
*/
.section .text
.global reset
reset:
/* Enter svc mode and mask interrupts */
mrs r0, cpsr
bic r0, r0, #MODEMASK
orr r0, r0, #MODE_SVC|NOINT
msr cpsr_cxsf, r0
/* init cpu */
bl cpu_init_crit
/* todo:copyself to link address */
/* Copy vector to the correct address */
ldr r0, =system_vectors
mrc p15, 0, r2, c1, c0, 0
ands r2, r2, #(1 << 13)
ldreq r1, =0x00000000
ldrne r1, =0xffff0000
ldmia r0!, {r2-r8, r10}
stmia r1!, {r2-r8, r10}
ldmia r0!, {r2-r8, r10}
stmia r1!, {r2-r8, r10}
/* turn off the watchdog */
ldr r0, =0x01C20CB8
mov r1, #0x0
str r1, [r0]
/* mask all IRQs source */
ldr r1, =0xffffffff
ldr r0, =0x01C20430
str r1, [r0], #0x04
str r1, [r0]
/* Call low level init function */
ldr sp, =svc_stack_start
ldr r0, =rt_low_level_init
blx r0
/* init stack */
bl stack_setup
/* clear bss */
mov r0, #0
ldr r1, =__bss_start
ldr r2, =__bss_end
bss_clear_loop:
cmp r1, r2
strlo r0, [r1], #4
blo bss_clear_loop
/* call c++ constructors of global objects */
/*
ldr r0, =__ctors_start__
ldr r1, =__ctors_end__
ctor_loop:
cmp r0, r1
beq ctor_end
ldr r2, [r0], #4
stmfd sp!, {r0-r1}
mov lr, pc
bx r2
ldmfd sp!, {r0-r1}
b ctor_loop
ctor_end:
*/
/* start RT-Thread Kernel */
ldr pc, _rtthread_startup
_rtthread_startup:
.word rtthread_startup
cpu_init_crit:
/* invalidate I/D caches */
mov r0, #0
mcr p15, 0, r0, c7, c7, 0
mcr p15, 0, r0, c8, c7, 0
/* disable MMU stuff and caches */
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002300
bic r0, r0, #0x00000087
orr r0, r0, #0x00000002
orr r0, r0, #0x00001000
mcr p15, 0, r0, c1, c0, 0
bx lr
stack_setup:
/* Setup Stack for each mode */
mrs r0, cpsr
bic r0, r0, #MODEMASK
orr r1, r0, #MODE_UND|NOINT
msr cpsr_cxsf, r1
ldr sp, =und_stack_start
orr r1, r0, #MODE_ABT|NOINT
msr cpsr_cxsf, r1
ldr sp, =abt_stack_start
orr r1, r0, #MODE_IRQ|NOINT
msr cpsr_cxsf, r1
ldr sp, =irq_stack_start
orr r1, r0, #MODE_FIQ|NOINT
msr cpsr_cxsf, r1
ldr sp, =fiq_stack_start
orr r1, r0, #MODE_SYS|NOINT
msr cpsr_cxsf,r1
ldr sp, =sys_stack_start
orr r1, r0, #MODE_SVC|NOINT
msr cpsr_cxsf, r1
ldr sp, =svc_stack_start
bx lr
/*
***************************************
* exception handlers
***************************************
*/
.global rt_hw_trap_udef
.global rt_hw_trap_swi
.global rt_hw_trap_pabt
.global rt_hw_trap_dabt
.global rt_hw_trap_resv
.global rt_hw_trap_irq
.global rt_hw_trap_fiq
.global rt_interrupt_enter
.global rt_interrupt_leave
.global rt_thread_switch_interrupt_flag
.global rt_interrupt_from_thread
.global rt_interrupt_to_thread
/* Interrupt */
.align 5
vector_fiq:
stmfd sp!,{r0-r7,lr}
bl rt_hw_trap_fiq
ldmfd sp!,{r0-r7,lr}
subs pc, lr, #4
.align 5
vector_irq:
stmfd sp!, {r0-r12,lr}
bl rt_interrupt_enter
bl rt_hw_trap_irq
bl rt_interrupt_leave
ldr r0, =rt_thread_switch_interrupt_flag
ldr r1, [r0]
cmp r1, #1
beq rt_hw_context_switch_interrupt_do
ldmfd sp!, {r0-r12,lr}
subs pc, lr, #4
rt_hw_context_switch_interrupt_do:
mov r1, #0
str r1, [r0]
mov r1, sp
add sp, sp, #4*4
ldmfd sp!, {r4-r12,lr}
mrs r0, spsr
sub r2, lr, #4
msr cpsr_c, #I_BIT|F_BIT|MODE_SVC
stmfd sp!, {r2}
stmfd sp!, {r4-r12,lr}
ldmfd r1, {r1-r4}
stmfd sp!, {r1-r4}
stmfd sp!, {r0}
ldr r4, =rt_interrupt_from_thread
ldr r5, [r4]
str sp, [r5]
ldr r6, =rt_interrupt_to_thread
ldr r6, [r6]
ldr sp, [r6]
ldmfd sp!, {r4}
msr spsr_cxsf, r4
ldmfd sp!, {r0-r12,lr,pc}^
/* Exception */
.macro push_svc_reg
sub sp, sp, #17 * 4
stmia sp, {r0 - r12}
mov r0, sp
mrs r6, spsr
str lr, [r0, #15*4]
str r6, [r0, #16*4]
str sp, [r0, #13*4]
str lr, [r0, #14*4]
.endm
.align 5
.weak SVC_Handler
SVC_Handler:
vector_swi:
push_svc_reg
bl rt_hw_trap_swi
b .
.align 5
vector_undef:
push_svc_reg
bl rt_hw_trap_udef
b .
.align 5
vector_pabt:
push_svc_reg
bl rt_hw_trap_pabt
b .
.align 5
vector_dabt:
push_svc_reg
bl rt_hw_trap_dabt
b .
.align 5
vector_resv:
push_svc_reg
bl rt_hw_trap_resv
b .
link.lds:
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
SECTIONS
{
. = 0x80000000;
. = ALIGN(4);
__text_start = .;
.text :
{
*(.vectors)
*(.text)
*(.text.*)
KEEP(*(.fini))
/* section information for finsh shell */
. = ALIGN(4);
__fsymtab_start = .;
KEEP(*(FSymTab))
__fsymtab_end = .;
. = ALIGN(4);
__vsymtab_start = .;
KEEP(*(VSymTab))
__vsymtab_end = .;
. = ALIGN(4);
/* section information for modules */
. = ALIGN(4);
__rtmsymtab_start = .;
KEEP(*(RTMSymTab))
__rtmsymtab_end = .;
/* section information for initialization */
. = ALIGN(4);
__rt_init_start = .;
KEEP(*(SORT(.rti_fn*)))
__rt_init_end = .;
} =0
__text_end = .;
__rodata_start = .;
.rodata : { *(.rodata) *(.rodata.*) *(.eh_frame) }
__rodata_end = .;
. = ALIGN(4);
.ctors :
{
PROVIDE(__ctors_start__ = .);
*crtbegin.o(.ctors)
*crtbegin?.o(.ctors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
*(SORT(.ctors.*))
*(.ctors)
PROVIDE(__ctors_end__ = .);
}
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
}
/* The .ARM.exidx section is used for C++ exception handling. */
/* .ARM.exidx is sorted, so has to go in its own output section. */
__exidx_start = .;
ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
/* This is used by the startup in order to initialize the .data secion */
_sidata = .;
}
__exidx_end = .;
.dtors :
{
PROVIDE(__dtors_start__ = .);
*crtbegin.o(.dtors)
*crtbegin?.o(.dtors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
*(SORT(.dtors.*))
*(.dtors)
PROVIDE(__dtors_end__ = .);
}
__data_start = .;
. = ALIGN(4);
.data :
{
*(.data)
*(.data.*)
. = ALIGN(4);
/* preinit data */
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP(*(.preinit_array))
PROVIDE_HIDDEN (__preinit_array_end = .);
. = ALIGN(4);
/* init data */
PROVIDE_HIDDEN (__init_array_start = .);
KEEP(*(SORT(.init_array.*)))
KEEP(*(.init_array))
PROVIDE_HIDDEN (__init_array_end = .);
. = ALIGN(4);
/* finit data */
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP(*(SORT(.fini_array.*)))
KEEP(*(.fini_array))
PROVIDE_HIDDEN (__fini_array_end = .);
KEEP(*(.jcr*))
. = ALIGN(4);
/* All data end */
*(.gnu.linkonce.d*)
}
__data_end = .;
. = ALIGN(4);
__bss_start = .;
.bss :
{
*(.bss)
*(.bss.*)
*(COMMON)
. = ALIGN(4);
}
. = ALIGN(4);
__bss_end = .;
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_info 0 : { *(.debug_info) }
.debug_line 0 : { *(.debug_line) }
.debug_pubnames 0 : { *(.debug_pubnames) }
.debug_aranges 0 : { *(.debug_aranges) }
_end = .;
}
最近编辑记录 duckduckgo (2019-06-14 10:16:47)
离线
你把最终要的头信息都丢了
.global _start
_start:
/* Boot head information for BROM */
.long 0xea000016
.byte 'e', 'G', 'O', 'N', '.', 'B', 'T', '0'
.long 0, 0x2000
.byte 'S', 'P', 'L', 2
.long 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0 /* 0x28 - boot type */
.long 0, 0, 0, 0, 0, 0, 0, 0 /* 0x40 - boot params, 0x5c - dram size */
而且ld文件里
.obj/source/start.o (.text)一定要放到最开始
最后还要用tools下面mksunxi对头信息处理一下
离线
你把最终要的头信息都丢了
.global _start
_start:
/* Boot head information for BROM */
.long 0xea000016
.byte 'e', 'G', 'O', 'N', '.', 'B', 'T', '0'
.long 0, 0x2000
.byte 'S', 'P', 'L', 2
.long 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0 /* 0x28 - boot type */
.long 0, 0, 0, 0, 0, 0, 0, 0 /* 0x40 - boot params, 0x5c - dram size */
而且ld文件里
.obj/source/start.o (.text)一定要放到最开始最后还要用tools下面mksunxi对头信息处理一下
这么说 中断向量不放到0了? 中断向量首地址是不是要重新在cp15配置了
离线
达克罗德 说:你把最终要的头信息都丢了
.global _start
_start:
/* Boot head information for BROM */
.long 0xea000016
.byte 'e', 'G', 'O', 'N', '.', 'B', 'T', '0'
.long 0, 0x2000
.byte 'S', 'P', 'L', 2
.long 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0 /* 0x28 - boot type */
.long 0, 0, 0, 0, 0, 0, 0, 0 /* 0x40 - boot params, 0x5c - dram size */
而且ld文件里
.obj/source/start.o (.text)一定要放到最开始最后还要用tools下面mksunxi对头信息处理一下
这么说 中断向量不放到0了? 中断向量首地址是不是要重新在cp15配置了
只是编译的时候放到文件的头,这样就放到flash的头,启动之后,ram或dram内容都是自己控制了。这个spl也就没用了
离线
Jin劲 说:达克罗德 说:你把最终要的头信息都丢了
.global _start
_start:
/* Boot head information for BROM */
.long 0xea000016
.byte 'e', 'G', 'O', 'N', '.', 'B', 'T', '0'
.long 0, 0x2000
.byte 'S', 'P', 'L', 2
.long 0, 0
.long 0, 0, 0, 0, 0, 0, 0, 0 /* 0x28 - boot type */
.long 0, 0, 0, 0, 0, 0, 0, 0 /* 0x40 - boot params, 0x5c - dram size */
而且ld文件里
.obj/source/start.o (.text)一定要放到最开始最后还要用tools下面mksunxi对头信息处理一下
这么说 中断向量不放到0了? 中断向量首地址是不是要重新在cp15配置了
只是编译的时候放到文件的头,这样就放到flash的头,启动之后,ram或dram内容都是自己控制了。这个spl也就没用了
brom拷贝flash代码到sram,还拷贝这个头部吗?如果拷贝这个头部,是否brom拷贝到sram后,brom代码控制pc跳到0x1C(头部是0x0-0x018)?
离线
brom应该不拷贝这个头,我记得这个头会填上跳转地址的,所以brom知道怎么跳
离线
裸奔的例子。
离线
下载程序到荔枝派Nano,ok了。
编译不知道怎么用?以下是“荔枝派Licheepi nano裸机移植ZLG_GUI和3D旋转立方体”的一段
终端中输入 sudo su ,然后输入密码进入root模式,然后输入 export PATH=$PATH:/opt/gcc-linaro-5.3.1-2016.05-x86_64_arm-eabi/bin (注意替换为自己下载的编译链的名字和放置的实际地址),既将编译链临时加入到路径中。关闭终端后再开启需要重新输入。
终端中cd 到minimal_f1c100s_framebuffer\minimal_f1c100s 文件夹下,然后输入 make ,回车开始编译。当提示什么错误时,你需要再看看交叉编译环境的搭建部分。
sudo su 在什么地方能执行?
离线
晕哥,是这个网址。
这个网址的minimal_f1c100s_fb_zlggui.rar源码,其.bin能下载到 荔枝派Nano,5寸电容屏能显示。
所以,看看能不能修改程序,想编译一下。
我一直搞单片机的。Linux等没有搞过,见笑了。
export PATH=$PATH:/opt/gcc-linaro-5.3.1-2016.05-x86_64_arm-eabi/bin
这个需要在什么地方运行? 麻烦你,能截个图吗?
离线
export PATH=$PATH:/opt/gcc-linaro-5.3.1-2016.05-x86_64_arm-eabi/bin
这个命令的意思是, 把 /opt/gcc-linaro-5.3.1-2016.05-x86_64_arm-eabi/bin 这个路径添加到系统搜索目录,
然后可以直接执行: arm-linux-gnueabi-gcc 这种 gcc 编译命令.
你可以在命令窗口直接运行.
在线
是不是需要进入Linux系统,才能用这个命令?
WINDOWS 下的不能用的?
离线
“荔枝派Licheepi nano裸机移植ZLG_GUI和3D旋转立方体”的源程序,
已经可以,修改、编译、下载了。
Ubuntu太难学了:
export PATH=$PATH:/opt/gcc531/bin 不行
export PATH=$PATH:/home/pyl/opt/gcc531/bin OK (注: pyl为用户名)
Windows 下,我一般用UltraEdit写程序,
Ubuntu下,用什么?
好像,Ubuntu下,不能访问Windows下的文件啊。
最近编辑记录 hzpyl (2019-07-13 21:05:20)
离线
我前面说错了, 如果只编译楼主的项目或者 xboot, 可以不用 Linux
在Linux 就可以搞定
Windows 软件浮点数工具链:
https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/arm-linux-gnueabi/
mingw32/64:
https://download.qt.io/development_releases/prebuilt/mingw_32/
不过, 你仍然得学下命令行和Makefile等。
在线
0752ben 说:你好,达克罗德。
我的工程替换了71楼的 “完整FB-f1c100s.c文件”,编译成功后,修改pdat->timing.pixel_clock_hz ,情况是一样的,LCD_CLK硬件引脚就没有信号输出。启动时PLL_VIDEO时钟只有198MHZ,而全志要求和pixel时钟的倍数必须大于等于4,实际我发现大于等于6才行。所以33Mhz以上TCON时钟工作不正常
需要把PLL video时钟设高一点
把sys_clock.c中write32(F1C100S_CCU_BASE + CCU_PLL_VIDEO_CTRL, 0x81004107);
时钟输出=24000000*(0x41+1)/(0x07+1)=198Mhz
改为write32(F1C100S_CCU_BASE + CCU_PLL_VIDEO_CTRL, 0x81004103);
时钟输出=24000000*(0x41+1)/(0x03+1)=396Mhz
这时候pixel_clock_hz能设置成更高时钟了
你好,
F1C100S 裸机的话,能支持到1200x1920吗?
离线
不可能这么高分辨率,内存带宽还有CPU主频限制了
离线
F1C100S 的RTT Keil/IAR工程怎么生成的?RTT的env下运行scons --target=iar的提示如下--
> scons --target=iar
scons: Reading SConscript files ...
Please make sure your toolchains is GNU GCC!
离线
你好,按照你的教程,成功在480x272的屏幕上实现了,非常感谢大神的详细教程。:D
有一个小小的建议:
MyCommon.C里,Set_Point和Get_Point里有两个野值800,对移植不太友好。
basicdev 说:这个Demo真是666,这个是gif的吗,是不是用zlg gui模拟器导出的gif,方便分享代码吗?
想多了,这个是荔枝派屏幕显示,手机拍下来,然后软件转成GIF的,图像质量一下降,颜色都没了,不好看了。
但这个的demo我已经写了教程,在博客园,有源码。 https://www.cnblogs.com/zhinianzhizhan/p/10051013.html 。
就是在荔枝派Nano上面移植显示的,要的话拿去。不过没有你说的GUI自己导出GIF的功能........它没有那么高级,图片显示函数都要自己写,简单的菜单等功能倒是能实现,虽然丑了点。而且我不清楚这个GUI是否免费,纯粹拿来玩。如果你想要你说的功能,得自己写或另外移植支持此功能的GUI了。另外,驱动代码就是本帖子的大神的作品,希望楼主允许。
最近编辑记录 northerntree (2019-09-27 13:37:50)
离线
晕哥,这个问题解决了。
现在有另一个问题。
同样的程序,烧写进荔枝派nano可以执行。但是使用我自己画的板子,程序能够烧写进Flash里面,重启后没有任何反应。
(1)能够烧写程序进Spi Flash
(2)重启后没有进入USB FEL模式
(3)板子布线 SPI Flash离CPU是4cm。
离线
楼主大大,我下载了这个工程,编译生成bin文件,使用sunxi-tools-win32support_f1c100s_flash工具,烧写后。
LED无法点亮,串口没有数据。请问是否因为我的SPIflash是16MB的,跟你的链接脚本对应不上呢?
这个情况,使用的是荔枝派nano,更换了一个下载工具版本就可以了。
下载 sunxi-tools-win32support_f1c100s(20180329).7z,解压缩, 运行 zadig-2.3.exe
点击 Options -> List All Devices:
https://whycan.cn/files/members/3/QQ20180416161704.png
选择 WinUSB (v6.1.7600.16385)
点击 【Install WCID Driver】https://whycan.cn/files/members/3/QQ20180416161712.png
按上面步奏装好驱动https://whycan.cn/files/members/3/QQ20180416161717.png
装完后,sunxi-fel.exe 运行一切正常。接下来烧录一个spi flash试一试。
最近编辑记录 LinjieGuo (2019-10-02 04:39:45)
离线
目前,我自己做的板子,程序烧录之后,还是无法正常执行程序。LED无法点亮,串口也没有数据输出!
板子PCB文件:F1C100S-Cube_.zip
板子SCH文件:F1C100S-Cube_SCH.zip
最近编辑记录 LinjieGuo (2019-10-02 04:54:07)
离线
在线
LinjieGuo 说:目前,我自己做的板子,程序烧录之后,还是无法正常执行程序。LED无法点亮,串口也没有数据输出!
板子PCB文件:F1C100S-Cube_.zip
板子SCH文件:F1C100S-Cube_SCH.zip同样的程序烧录到 荔枝派 nano OK ?
是的,程序烧录到荔枝派是没问题的.
能够进入USB FEL模式,并且下载程序也是没有问题。就是下载之后,无法执行。
最近编辑记录 LinjieGuo (2019-10-02 13:14:39)
离线
用一个ams1117-2.5。
不过,你这个问题,应该还是别的问题,
最近编辑记录 wangzhg1 (2019-10-04 08:23:02)
离线
楼主,我编译了你的代码。可以通过烧录运行,但下载到内存执行失败。我用的下面的指令:
sunxi-fel -p write 0x80000000 firmware.bin
sunxi-fel exec 0x80000000
看@晕哥 的帖子 https://whycan.cn/t_449.html xboot是可以直接下载运行的,你这个是不能直接下载运行的吗?
最近编辑记录 jlau (2019-10-11 21:04:37)
离线
楼主,我编译了你的代码。可以通过烧录运行,但下载到内存执行失败。我用的下面的指令:
sunxi-fel -p write 0x80000000 firmware.bin
sunxi-fel exec 0x80000000看@晕哥 的帖子 https://whycan.cn/t_449.html xboot是可以直接下载运行的,你这个是不能直接下载运行的吗?
找到方法了,新的下载运行命令变了:
sunxi-fel spl xboot.bin; sunxi-fel -p write 0x80000000 xboot.bin; sunxi-fel exec 0x80000000;
离线
@达克罗德 你好,这个裸机工程能放到eclipse里编译吗?是否可以用eclipse来代替@晕哥的IAR demo来单步调试呢?因为IAR jilink调试需要先烧录xboot,我现在想做的是能直接进行裸机单步并且能点亮屏幕。
离线
@达克罗德 你好,这个裸机工程能放到eclipse里编译吗?是否可以用eclipse来代替@晕哥的IAR demo来单步调试呢?因为IAR jilink调试需要先烧录xboot,我现在想做的是能直接进行裸机单步并且能点亮屏幕。
eclipse编译肯定可以。调试我不懂。现在基本就靠打印来调试
离线
gui401 说:@达克罗德 你好,这个裸机工程能放到eclipse里编译吗?是否可以用eclipse来代替@晕哥的IAR demo来单步调试呢?因为IAR jilink调试需要先烧录xboot,我现在想做的是能直接进行裸机单步并且能点亮屏幕。
eclipse编译肯定可以。调试我不懂。现在基本就靠打印来调试
谢谢!能分享一下这个裸机的eclipse工程吗?我自己建的编译出一堆错误,无从下手了。
离线
达克罗德 说:gui401 说:@达克罗德 你好,这个裸机工程能放到eclipse里编译吗?是否可以用eclipse来代替@晕哥的IAR demo来单步调试呢?因为IAR jilink调试需要先烧录xboot,我现在想做的是能直接进行裸机单步并且能点亮屏幕。
eclipse编译肯定可以。调试我不懂。现在基本就靠打印来调试
谢谢!能分享一下这个裸机的eclipse工程吗?我自己建的编译出一堆错误,无从下手了。
我没有工程。按理eclipse也是执行我写的Makefile就好。不要用eclipse自己的Makefile
离线
这颗芯片不错。
离线
想多了,这个是荔枝派屏幕显示,手机拍下来,然后软件转成GIF的,图像质量一下降,颜色都没了,不好看了。
但这个的demo我已经写了教程,在博客园,有源码。 https://www.cnblogs.com/zhinianzhizhan/p/10051013.html 。
就是在荔枝派Nano上面移植显示的,要的话拿去。不过没有你说的GUI自己导出GIF的功能........它没有那么高级,图片显示函数都要自己写,简单的菜单等功能倒是能实现,虽然丑了点。而且我不清楚这个GUI是否免费,纯粹拿来玩。如果你想要你说的功能,得自己写或另外移植支持此功能的GUI了。另外,驱动代码就是本帖子的大神的作品,希望楼主允许。
大神,小弟新手一枚,想求您共享一下您 https://www.cnblogs.com/zhinianzhizhan/p/10051013.html 中的《基于荔枝派Nano的Linux新手学习笔记》这个资料你博客中的QQ群里面已经没有这个可以下载了,感觉这个资料对我这样的新手指导意义非凡。在此先谢谢啦。
离线
你好@达克罗德 我用这个裸机工程在while(1)里通过寄存器翻转某个IO,示波器测频率只能达到3MHz,有办法提高吗?while里就read32和write32语句写0写1都执行一次读写,按道理不应该这么慢啊
离线
你好@达克罗德 我用这个裸机工程在while(1)里通过寄存器翻转某个IO,示波器测频率只能达到3MHz,有办法提高吗?while里就read32和write32语句写0写1都执行一次读写,按道理不应该这么慢啊
没试过,我估计芯片设计决定的吧,记得有人说过,这种mpu翻转io还不如单片机的
离线
你好@达克罗德 我用这个裸机工程在while(1)里通过寄存器翻转某个IO,示波器测频率只能达到3MHz,有办法提高吗?while里就read32和write32语句写0写1都执行一次读写,按道理不应该这么慢啊
确实就是这么慢。如果你翻转时,同一组的其他IO口的状态是确定的,那可以省略一次read32,直接写值,速度能到6.xMHz。
离线
学习ing, 多谢诸位分享!
离线
太好了,可以当MCU用了,谢谢分享。请教一下:nano最大支持多大的分辨率?想把笔记本的屏幕用上。
离线
谢谢,不知道怎么弄成可以在keil上编译后可以直接下载到spi flash直接运行的,苦恼。
离线
不可能这么高分辨率,内存带宽还有CPU主频限制了
不在乎帧数, 慢点没关系呢?
离线
谢谢分享,学习了
离线
root@yu-virtual-machine:/home/yu/lichee/lvgl_f1c100s# make
arm-eabi-objcopy -v -O binary build/firmware.elf build/firmware.bin
copy from `build/firmware.elf' [elf32-littlearm] to `build/firmware.bin' [binary]
Make header information for brom booting
tools/mksunxi/mksunxi: 1: tools/mksunxi/mksunxi: Syntax error: ")" unexpected
Makefile:140: recipe for target 'build/firmware.bin' failed
make: *** [build/firmware.bin] Error 2
各位大佬, 我用这个编译gcc-linaro-5.3.1-2016.05-i686_arm-eabi.tar
出现了以上的错误,请教下是什么问题?
离线
root@yu-virtual-machine:/home/yu/lichee/lvgl_f1c100s# make
arm-eabi-objcopy -v -O binary build/firmware.elf build/firmware.bin
copy from `build/firmware.elf' [elf32-littlearm] to `build/firmware.bin' [binary]
Make header information for brom booting
tools/mksunxi/mksunxi: 1: tools/mksunxi/mksunxi: Syntax error: ")" unexpected
Makefile:140: recipe for target 'build/firmware.bin' failed
make: *** [build/firmware.bin] Error 2各位大佬, 我用这个编译gcc-linaro-5.3.1-2016.05-i686_arm-eabi.tar
出现了以上的错误,请教下是什么问题?
makefile贴一下,多写了个括号吧?
离线
大佬,
这是原代码:
lvgl_f1c100s.zip
大佬帮忙看下,好像是 140行这里错了 @$(MKSUNXI) $@,但是我新手看不懂
这是makefile的文件:
#
# Machine makefile
#
.PHONY:clean
.PHONY:write
.PHONY:mktool
.PHONY:dump
BUILD ?= build
RM = rm
ECHO = @echo
CP = cp
MKDIR = mkdir
SED = sed
PYTHON = python
CROSS_COMPILE = arm-eabi-
CC = $(CROSS_COMPILE)gcc
AS = $(CROSS_COMPILE)gcc -x assembler-with-cpp
LD = $(CROSS_COMPILE)ld
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
SIZE = $(CROSS_COMPILE)size
CSRCS = \
main.c \
machine/sys-clock.c \
machine/sys-dram.c \
machine/sys-uart.c \
machine/sys-copyself.c \
machine/sys-spi-flash.c \
machine/sys-mmu.c \
machine/exception.c \
# drivers
CSRCS += \
driver/gpio-f1c100s.c \
driver/pwm-f1c100s.c \
driver/reset-f1c100s.c \
lib/malloc.c \
lib/dma.c \
driver/clk-f1c100s-pll.c \
driver/fb-f1c100s.c \
arch/arm32/lib/strcpy.c \
arch/arm32/lib/strlen.c \
SRC_ASM = machine/start.S \
arch/arm32/lib/memcmp.S \
arch/arm32/lib/memcpy.S \
arch/arm32/lib/memmove.S \
arch/arm32/lib/memset.S \
arch/arm32/lib/setjmp.S \
arch/arm32/lib/strcmp.S \
arch/arm32/lib/strncmp.S \
#LIBRARIES
include ./lvgl/lv_core/lv_core.mk
include ./lvgl/lv_hal/lv_hal.mk
include ./lvgl/lv_objx/lv_objx.mk
include ./lvgl/lv_fonts/lv_fonts.mk
include ./lvgl/lv_misc/lv_misc.mk
include ./lvgl/lv_themes/lv_themes.mk
include ./lvgl/lv_draw/lv_draw.mk
#DRIVERS
#include ./lv_drivers/display/display.mk
#include ./lv_drivers/indev/indev.mk
#EXAMPLES
include ./lv_examples/lv_tests/lv_test_obj/lv_test_obj.mk
include ./lv_examples/lv_tests/lv_test_stress/lv_test_stress.mk
include ./lv_examples/lv_tests/lv_test_theme/lv_test_theme.mk
include ./lv_examples/lv_tests/lv_test_group/lv_test_group.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_bar/lv_test_bar.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_btn/lv_test_btn.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_btnm/lv_test_btnm.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_cb/lv_test_cb.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_chart/lv_test_chart.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_cont/lv_test_cont.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_ddlist/lv_test_ddlist.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_gauge/lv_test_gauge.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_img/lv_test_img.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_kb/lv_test_kb.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_label/lv_test_label.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_led/lv_test_led.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_line/lv_test_line.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_list/lv_test_list.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_lmeter/lv_test_lmeter.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_mbox/lv_test_mbox.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_page/lv_test_page.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_roller/lv_test_roller.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_slider/lv_test_slider.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_sw/lv_test_sw.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_ta/lv_test_ta.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_tabview/lv_test_tabview.mk
include ./lv_examples/lv_tests/lv_test_objx/lv_test_win/lv_test_win.mk
include ./lv_examples/lv_apps/benchmark/benchmark.mk
include ./lv_examples/lv_apps/demo/demo.mk
include ./lv_examples/lv_apps/sysmon/sysmon.mk
include ./lv_examples/lv_apps/terminal/terminal.mk
include ./lv_examples/lv_apps/tpcal/tpcal.mk
include ./lv_examples/lv_tutorial/1_hello_world/lv_tutorial_hello_world.mk
include ./lv_examples/lv_tutorial/2_objects/lv_tutorial_objects.mk
include ./lv_examples/lv_tutorial/3_styles/lv_tutorial_styles.mk
include ./lv_examples/lv_tutorial/4_themes/lv_tutorial_themes.mk
include ./lv_examples/lv_tutorial/5_antialiasing/lv_tutorial_antialiasing.mk
include ./lv_examples/lv_tutorial/6_images/lv_tutorial_images.mk
include ./lv_examples/lv_tutorial/7_fonts/lv_tutorial_fonts.mk
include ./lv_examples/lv_tutorial/8_animations/lv_tutorial_animations.mk
include ./lv_examples/lv_tutorial/9_responsive/lv_tutorial_responsive.mk
OBJ = $(addprefix $(BUILD)/, $(CSRCS:.c=.o)) $(addprefix $(BUILD)/, $(SRC_ASM:.S=.o))
DEFINES += -D__ARM32_ARCH__=5 -D__ARM926EJS__
ASFLAGS := -g -ggdb -Wall -O3 -ffreestanding -std=gnu99 $(DEFINES)
CFLAGS := -g -ggdb -Wall -O3 -ffreestanding -std=gnu99 $(DEFINES)
CXXFLAGS := -g -ggdb -Wall -O3 -ffreestanding -std=gnu99 $(DEFINES)
LDFLAGS := -T f1c100s.ld -nostdlib
MCFLAGS := -march=armv5te -mtune=arm926ej-s -mfloat-abi=soft -marm -mno-thumb-interwork
LIBDIRS :=
LIBS := -lgcc
INCDIRS := -Imachine/include -Iarch/arm32/include -I.
SRCDIRS :=
INCDIRS += -Idriver/include -Ilib
# $(BUILD)/firmware_boot.bin:$(BUILD)/firmware.bin
# ./tools/mksunxiboot/mksunxiboot $^ $@
$(BUILD)/firmware.bin: $(BUILD)/firmware.elf
$(OBJCOPY) -v -O binary $^ $@
@echo Make header information for brom booting
@$(MKSUNXI) $@
$(BUILD)/firmware.elf: $(OBJ)
$(ECHO) "LINK $@"
$(CC) $(LDFLAGS) -Wl,--cref,-Map=$@.map -o $@ $^ $(LIBS)
$(SIZE) $@
$(BUILD)/%.o: %.S
$(ECHO) "AS $<"
$(AS) $(MCFLAGS) $(ASFLAGS) -c -o $@ $<
$(BUILD)/%.o: %.s
$(ECHO) "AS $<"
$(AS) $(MCFLAGS) $(CFLAGS) -o $@ $<
define compile_c
$(ECHO) "CC $<"
$(CC) $(INCDIRS) $(MCFLAGS) $(CFLAGS) -c -MD -o $@ $<
@# The following fixes the dependency file.
@# See http://make.paulandlesley.org/autodep.html for details.
@# Regex adjusted from the above to play better with Windows paths, etc.
@$(CP) $(@:.o=.d) $(@:.o=.P); \
$(SED) -e 's/#.*//' -e 's/^.*: *//' -e 's/ *\\$$//' \
-e '/^$$/ d' -e 's/$$/ :/' < $(@:.o=.d) >> $(@:.o=.P); \
$(RM) -f $(@:.o=.d)
endef
$(BUILD)/%.o: %.c
$(call compile_c)
OBJ_DIRS = $(sort $(dir $(OBJ)))
$(OBJ): | $(OBJ_DIRS)
$(OBJ_DIRS):
$(MKDIR) -p $@
clean:
find . -name "*.o" | xargs rm -f
find . -name "*.bin" | xargs rm -f
find . -name "*.elf" | xargs rm -f
find . -name "*.P" | xargs rm -f
#rm -rf *.o *.bin
#rm -rf $(BUILD)/*.o $(BUILD)/*.bin
write:
sudo sunxi-fel -p spiflash-write 0 $(BUILD)/firmware.bin
mktool:
cd tools/mksunxiboot && make
cd tools/mksunxi && make
dump:
$(OBJDUMP) -S myboot.o | less
MKSUNXI := tools/mksunxi/mksunxi
mkboot:
@echo Make header information for brom booting
@$(MKSUNXI) $(BUILD)/firmware.bin
离线
makefile贴一下,多写了个括号吧?
找到原因了 ,tools/mksunxi/mksunxi目录下的mksunxi要用新的编译链编译下。
离线
mark
离线
Nice work.
What "pdat->pwidth" and "pdat->pheight" are? What is "physical- width/height" ?
Is there a bare metal AUDIO or SD card driver?
离线
各位大神,有哪位知道楼主发的这个例子把framebuffer的颜色格式由原来的ARGB32格式改成RGB565格式的吗?具体要改哪些地方?
离线
Nice work.
What "pdat->pwidth" and "pdat->pheight" are? What is "physical- width/height" ?
Is there a bare metal AUDIO or SD card driver?
it is LCD physical size. they are not used, you don't need care about it.
离线
这个裸奔程序不错,感谢大神的贡献
离线
芯片不错,就是参考资料太有限了,。
离线
代码看起好简洁,逛了几天论坛,今天已下单TINY200板子。
离线
大佬你好,xboot支持F1C100S的硬件解码jpg以及音视频的播放吗?
离线
大佬你好,xboot支持F1C100S的硬件解码jpg以及音视频的播放吗?
据我所知是不支持的,RTT好像有网友实现了支持
离线
希望我可以快点能下载试试你的代码。。。
离线
我有两个屏,一个屏正常红色,一个屏不是。
离线
两个屏幕规格一样吗? 看下屏幕是 SYNC/DE 模式, 与开发板/代码是否一致?
肯定是不一样的。不行的那一块,我也不知道是什么规格什么参数。只能慢慢试吧,有哪些参数建议调整的吗
离线
两个屏幕规格一样吗? 看下屏幕是 SYNC/DE 模式, 与开发板/代码是否一致?
请问,这里的驱动方式,是串行的rgb通讯还是并行的?
离线
并行的,R/G/B一起发的。
我怀疑我的是串行的。程序发送的是红色,我的那个屏是白色。然后我调整大小的时候,它是会跟着改变大小的。就是只有颜色不对。当然,大小也会小很多。比如480*272的,是这样的。
离线
验证了,真的是。
我修改代码如下:
main函数里面的
然后结果这样
最近编辑记录 1035036848 (2020-04-30 12:13:17)
离线
非常感谢 已下载,编译通过了 F1C100s 正常运行
离线
非常感谢,先下来看看,晚点再回来回复,不知道跟其它裸奔的有什么区别
离线
Great!!!
离线
感谢大神的分享,现在刚开始学习F1c100s
离线
这个整的可以跑起来吗?我试一下!嘻嘻
离线
裸跑操作显示,太厉害了
离线
有点厉害,前来膜拜以下,最近也在弄F1C100S,学习下
离线
神仙到底在哪里,看看这里就知道了。
离线
裸机可以跑硬件解码H264的视频么?还是只有软解?貌似软解jpg然后显示没问题,但是播视频就没试过。
离线
确实很精简了,感谢楼主添砖加瓦.
离线
正要评估这款芯片,不知道裸奔效果如何,做串口屏的联系我啊 qq:2477550
离线
都是大佬 不知道我的板子啥时候才能玩得动
离线
感谢楼主分享,希望能有很大的帮助,早日向楼主看齐。
离线
framebuffer驱动我还是花了几个晚上功夫的,为了不用xboot的dts还有driver架构,把reset,clock等好几个模块都改了一遍。如果再来一遍V3S的话,应该容易很多,因为两芯片同出一源代码很类似。
不过不打算继续自己搞裸奔了,可重用性太低,累死人。准备直接用xboot或者RTOS这样的平台来开发后续产品,开发驱动有标准,代码容易复用,功能也更强大。比如说切换V3S和F1C100S对xboot来说非常简单,上层完全不用改
目前我把xboot优化到1.3MB大小(带文件系统和图形库),启动到logo只需要0.85s(F1C100S),基本满足需要。V3S没测,上电应该更快。如果V3S和F1C100S支持QSPI就完美了。。。
达克罗德您好,请问如果想要实现framebuffer 水平翻转,有可能实现吗,具体要怎么弄呢?
离线
今天刚到手荔枝派,自己仿照mksunxiboot写了一个下载到sd卡的程序,但BROM总是给我引导到SPIFlash自带的uboot里面。。头疼了,回复一下拿个下载权限,看看大佬是怎么写的
离线
请教诸位大佬,要将ARGB32格式改为RGB565格式,除了要将render->format改为PIXEL_FORMAT_RGB16_565,还需要做那些改动?
//render->format = PIXEL_FORMAT_ARGB32;
render->format = PIXEL_FORMAT_RGB16_565;
离线
在V3S和F1C100S间摇摆,不知道哪个好
离线
离线