DebugDump Forum

本站无需注册,无需积分,无需回复可下载所有资料,如果真的喜欢小站,请您注册之后请至少回复一个帖子激活Id,谢谢支持! 站长QQ: 516333132 (挖坑网/填坑网) admin@debugdump.com

您尚未登录。

#1 2018-08-02 15:58:00

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

F1C100S裸奔framebuffer+PWM+GPIO驱动

最近把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

20180802_004940.jpeg

源代码:
minimal_f1c100s_framebuffer.zip

离线

#2 2018-08-02 16:15:45

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,526

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

确实很精简了,感谢楼主添砖加瓦.

离线

#3 2018-08-02 18:25:54

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

要感谢xboot的原代码驱动!话说xboot是GNU license,以它的基础改的代码也应该开源。

另外xboot或者基于xboot改的代码能直接跑商业项目吗?按理得全部开源吧

离线

#4 2018-08-02 18:39:39

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,526

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

如果真是GPL,
可以单独找xboot本人单独申请一个商业授权,
xboot作者本人钱挺多,
而且很乐意帮忙解决问题。

离线

#5 2018-08-18 14:46:19

pqfeng
会员
注册时间: 2018-08-18
累计积分: 76

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

真的是好东西,再问一下,这个可以在V3S上跑么,如果要改大动,大概改哪里?谢谢。

离线

#6 2018-08-18 14:48:04

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,526

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

改动不会太大, 按楼主的套路, 从V3s扣代码就好了。

离线

#7 2018-08-19 00:04:32

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

framebuffer驱动我还是花了几个晚上功夫的,为了不用xboot的dts还有driver架构,把reset,clock等好几个模块都改了一遍。如果再来一遍V3S的话,应该容易很多,因为两芯片同出一源代码很类似。

不过不打算继续自己搞裸奔了,可重用性太低,累死人。准备直接用xboot或者RTOS这样的平台来开发后续产品,开发驱动有标准,代码容易复用,功能也更强大。比如说切换V3S和F1C100S对xboot来说非常简单,上层完全不用改

目前我把xboot优化到1.3MB大小(带文件系统和图形库),启动到logo只需要0.85s(F1C100S),基本满足需要。V3S没测,上电应该更快。如果V3S和F1C100S支持QSPI就完美了。。。

离线

#8 2018-08-19 00:11:01

sindy
会员
注册时间: 2017-09-09
累计积分: 143

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

向大神们学习.

离线

#9 2018-08-19 21:59:46

awfans
会员
注册时间: 2018-04-03
累计积分: 153

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

请问楼主你的 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

离线

#10 2018-08-19 22:03:45

awfans
会员
注册时间: 2018-04-03
累计积分: 153

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

然后换 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

离线

#11 2018-08-19 22:15:48

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

感觉你这个编译器不对,我是用xboot指定的5.3.1版
http://pan.baidu.com/s/1dDtssIt

离线

#12 2018-08-19 22:16:57

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

arm9没有hf的

离线

#13 2018-08-19 22:21:39

awfans
会员
注册时间: 2018-04-03
累计积分: 153

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

把 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

离线

#14 2018-08-19 22:24:26

awfans
会员
注册时间: 2018-04-03
累计积分: 153

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

达克罗德 说:

感觉你这个编译器不对,我是用xboot指定的5.3.1版
http://pan.baidu.com/s/1dDtssIt

我试一试这个.

离线

#15 2018-08-19 22:35:33

awfans
会员
注册时间: 2018-04-03
累计积分: 153

离线

#16 2018-08-19 22:47:19

awfans
会员
注册时间: 2018-04-03
累计积分: 153

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

果然顺利编译完成.

但是烧进去之后,屏幕串口都没有反应,
而且再次进入 fel 模式,
说明应该是有问题的。



烧这个demo也一样:
https://debugdump.com/t_1393.html

最近编辑记录 awfans (2018-08-19 22:50:02)

离线

#17 2018-08-19 22:54:06

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

mksunxi tool编了吗?
最后几行应该会显示brom been fixed字样,Bootloader size=xxxx

离线

#18 2018-08-19 23:03:59

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,526

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

估计就是这个问题了。

离线

#19 2018-08-19 23:17:33

awfans
会员
注册时间: 2018-04-03
累计积分: 153

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

终于搞定,谢谢达哥, 红红的LCD亮起来了.

离线

#20 2018-08-19 23:27:17

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

awfans 说:

终于搞定,谢谢达哥, 红红的LCD亮起来了.

问下你屏幕有条白线吗?我的有条白线,不知道是代码还有问题还是屏幕硬件有问题了

离线

#21 2018-08-19 23:34:57

awfans
会员
注册时间: 2018-04-03
累计积分: 153

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

我的是800x480的5寸屏,上面红红的,下面有一条灰色的,关电脑了,明天仔细看看。

离线

#22 2018-08-21 09:29:28

awfans
会员
注册时间: 2018-04-03
累计积分: 153

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

QQ20180821092612.jpg

就是这样的,看起来也挺正常, 800x480

离线

#23 2018-08-21 11:45:04

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

awfans 说:

https://debugdump.com/files/members/713/QQ20180821092612.jpg

就是这样的,看起来也挺正常, 800x480

下面怎么显示蓝色的?

离线

#24 2018-08-23 17:35:01

awfans
会员
注册时间: 2018-04-03
累计积分: 153

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

是呀,我也觉得好奇怪,屏幕是好的。

离线

#25 2018-08-23 17:35:37

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,526

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

QQ20180823173248.png

路过, 刚好在调 f1c100s

看了一下代码

估计是楼主手抖了. 

big_smile:D:D

离线

#26 2018-08-23 17:57:16

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

晕哥 说:

https://debugdump.com/files/members/3/QQ20180823173248.png

路过, 刚好在调 f1c100s

看了一下代码

估计是楼主手抖了. 

big_smile:D:D

:mad哈哈哈,多亏晕哥发现,太惭愧了,每次只要手填一堆数,总要出错。

离线

#27 2018-08-23 18:06:33

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,526

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

这个代码太好了,终于在 MDK 裸奔起来了.

离线

#28 2018-08-27 17:10:24

ippen
会员
注册时间: 2018-07-22
累计积分: 143

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

达克罗德 说:

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之类的呢

离线

#29 2018-08-27 17:22:25

awfans
会员
注册时间: 2018-04-03
累计积分: 153

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

不支持 ext2,自己移植才行吧

离线

#30 2018-08-31 10:13:01

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,526

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

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__

离线

#31 2018-08-31 10:40:14

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,526

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

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

离线

#32 2018-08-31 10:42:44

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,526

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

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)
{

};

https://blog.csdn.net/dddxxxx/article/details/47819809

离线

#33 2018-08-31 10:54:15

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,526

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

$ 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

最后一个链接错误,不知道怎么改了  sad
看来还是用 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]

离线

#34 2018-08-31 12:19:11

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

编译器差别这么大呀。。。
我都想用llvm了,公司用的就是llvm

离线

#35 2018-08-31 13:22:12

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,526

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

越是搞不明白的事情,越是想弄清楚,结果走进死胡同了。

离线

#36 2018-09-22 08:32:11

逸俊晨晖
会员
注册时间: 2018-08-29
累计积分: 20

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

感谢LZ分享:D

离线

#37 2018-09-29 16:14:56

Gardenia
会员
注册时间: 2018-09-29
累计积分: 15

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

牛,framebuffer好了,图片能支持PNG吗?bmp太占空间了。

离线

#38 2018-09-29 16:18:38

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,526

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

Gardenia 说:

牛,framebuffer好了,图片能支持PNG吗?bmp太占空间了。

移植一个 libpng 就支持 png图片了。

xboot本身就集成了 libpng.

离线

#39 2018-09-29 16:49:36

Gardenia
会员
注册时间: 2018-09-29
累计积分: 15

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

晕哥 说:
Gardenia 说:

牛,framebuffer好了,图片能支持PNG吗?bmp太占空间了。

移植一个 libpng 就支持 png图片了。

xboot本身就集成了 libpng.

嗯,看到了,xboot启动时间比较慢,如果要做到1秒以内启动,晕哥有没试过?有可行性不?

离线

#40 2018-09-29 17:17:46

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,526

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

Gardenia 说:
晕哥 说:
Gardenia 说:

牛,framebuffer好了,图片能支持PNG吗?bmp太占空间了。

移植一个 libpng 就支持 png图片了。

xboot本身就集成了 libpng.

嗯,看到了,xboot启动时间比较慢,如果要做到1秒以内启动,晕哥有没试过?有可行性不?

主要耗时在于spl(boot0)从spi 拷贝 xboot(boot1) 到DRAM,
想办法精简 xboot, 或者分时加载 xboot, 比如再弄个boot2, 系统boot1启动后再加载boot2.

离线

#41 2018-09-29 17:41:47

Gardenia
会员
注册时间: 2018-09-29
累计积分: 15

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

晕哥 说:
Gardenia 说:
晕哥 说:

移植一个 libpng 就支持 png图片了。

xboot本身就集成了 libpng.

嗯,看到了,xboot启动时间比较慢,如果要做到1秒以内启动,晕哥有没试过?有可行性不?

主要耗时在于spl(boot0)从spi 拷贝 xboot(boot1) 到DRAM,
想办法精简 xboot, 或者分时加载 xboot, 比如再弄个boot2, 系统boot1启动后再加载boot2.

好的,谢谢,我试试看。

离线

#42 2018-09-30 20:52:14

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

Gardenia 说:
晕哥 说:
Gardenia 说:

嗯,看到了,xboot启动时间比较慢,如果要做到1秒以内启动,晕哥有没试过?有可行性不?

主要耗时在于spl(boot0)从spi 拷贝 xboot(boot1) 到DRAM,
想办法精简 xboot, 或者分时加载 xboot, 比如再弄个boot2, 系统boot1启动后再加载boot2.

好的,谢谢,我试试看。

我做到800ms,主要是把romdisk裁剪了一点,把log关掉,不用的函数关掉,autoboot的一秒等待关掉,基本就差不多了。不要用压缩

离线

#43 2018-10-01 09:23:03

Gardenia
会员
注册时间: 2018-09-29
累计积分: 15

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

达克罗德 说:

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)

离线

#44 2018-10-01 09:25:43

路人甲
会员
注册时间: 2017-09-07
累计积分: 53

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

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吧。

离线

#45 2018-10-01 09:48:05

Gardenia
会员
注册时间: 2018-09-29
累计积分: 15

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

路人甲 说:
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吧。

特地看了下手册,应该是不支持的

离线

#46 2018-10-01 09:59:26

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,526

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

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.

离线

#47 2018-10-01 10:28:14

Gardenia
会员
注册时间: 2018-09-29
累计积分: 15

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

晕哥 说:

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.

lol,又有新的希望了。

离线

#48 2018-10-01 11:57:31

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

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,这还没法改,没办法这是全志写死了。所以优化空间也不多了

离线

#49 2018-10-01 13:34:32

Gardenia
会员
注册时间: 2018-09-29
累计积分: 15

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

达克罗德 说:
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已经非常好了

离线

#50 2018-10-04 02:19:28

Quotation
会员
注册时间: 2018-10-04
累计积分: 36

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

达克罗德 说:

目前我把xboot优化到1.3MB大小(带文件系统和图形库),启动到logo只需要0.85s(F1C100S),基本满足需要。V3S没测,上电应该更快。如果V3S和F1C100S支持QSPI就完美了。。。

我这里不带文件系统和图形库,只保留要用的功能和驱动,xboot可优化到240kB。很实用了。

对于很多应用,数据文件应该占ROM空间很大一部分。xboot把数据文件打包放在romdisk里,也会占用启动拷贝Flash的时间。这部分是可以优化成在启动之后做的。

离线

#51 2018-10-04 08:58:45

daydayup
会员
注册时间: 2017-10-09
累计积分: 294

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

Quotation 说:
达克罗德 说:

目前我把xboot优化到1.3MB大小(带文件系统和图形库),启动到logo只需要0.85s(F1C100S),基本满足需要。V3S没测,上电应该更快。如果V3S和F1C100S支持QSPI就完美了。。。

我这里不带文件系统和图形库,只保留要用的功能和驱动,xboot可优化到240kB。很实用了。

对于很多应用,数据文件应该占ROM空间很大一部分。xboot把数据文件打包放在romdisk里,也会占用启动拷贝Flash的时间。这部分是可以优化成在启动之后做的。

厉害厉害,能不能分享一下?

离线

#52 2018-10-04 22:59:12

Quotation
会员
注册时间: 2018-10-04
累计积分: 36

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

daydayup 说:

厉害厉害,能不能分享一下?

开新帖分享了裁剪方法,把XBOOT优化到<170kB了。https://debugdump.com/t_1708.html

离线

#53 2018-10-09 10:54:41

Gardenia
会员
注册时间: 2018-09-29
累计积分: 15

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

达克罗德 说:
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

离线

#54 2018-10-10 11:02:52

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

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
+#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);
+#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);

离线

#55 2018-10-10 21:07:41

Gardenia
会员
注册时间: 2018-09-29
累计积分: 15

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

达克罗德 说:
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
+#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);
+#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里面运行的,这里执行效率就相当低了。

最近编辑记录 Gardenia (2018-10-10 21:08:19)

离线

#56 2018-10-10 21:16:41

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,526

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

所有代码都在DDR或者SRAM跑,全志全部都没有XIP功能。

离线

#57 2018-10-10 22:31:52

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

Gardenia 说:
达克罗德 说:
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
+#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);
+#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里面运行的,这里执行效率就相当低了。

全志的brom程序启动时自动从spi nor拷贝最前面的几k代码到内部SRAM后执行的。后来因为SRAM太慢,xboot老大又改成再一次拷贝到dram后再从dram执行copyself,把整个image拷贝到DRAM

离线

#58 2018-10-11 11:19:14

Gardenia
会员
注册时间: 2018-09-29
累计积分: 15

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

谢谢,了解了,按你的改了又有些提升,目前效果还不错,谢谢楼主。

离线

#59 2018-10-22 09:19:52

alan8918
会员
注册时间: 2018-06-26
累计积分: 42

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

这玩意的性能,裸奔还是蛮有玩头的

离线

#60 2018-11-02 13:53:36

cddxhy
会员
注册时间: 2018-11-02
累计积分: 1

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

裸奔?好多库不能用呢?

离线

#61 2018-11-02 14:02:25

lilo
会员
注册时间: 2017-10-15
累计积分: 214

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

cddxhy 说:

裸奔?好多库不能用呢?

需要什么库

离线

#62 2018-11-17 09:55:25

Pese
会员
注册时间: 2017-11-28
累计积分: 13

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

楼主位的外设驱动代码(spi iic uasrt等),都验证可用的吗?

离线

#63 2018-11-17 10:55:26

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,526

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

Pese 说:

楼主位的外设驱动代码(spi iic uasrt等),都验证可用的吗?

可以的,都验证过了。

离线

#64 2018-11-17 17:57:42

Pese
会员
注册时间: 2017-11-28
累计积分: 13

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

请教,楼主位的framebuffer,有没有画点函数?

离线

#65 2018-11-18 08:58:03

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

Pese 说:

请教,楼主位的framebuffer,有没有画点函数?

framebuffer都有了,画点就是把rgba写到对应行列的那个32位数

离线

#66 2018-11-18 14:53:20

Pese
会员
注册时间: 2017-11-28
累计积分: 13

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

达克罗德 说:
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)

离线

#67 2018-11-18 16:05:46

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

Pese 说:
达克罗德 说:
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

离线

#68 2018-11-19 11:27:46

Pese
会员
注册时间: 2017-11-28
累计积分: 13

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

达克罗德 说:
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

折腾一下,还是不行,不知道为什么,这是什么原因?
代码和显示如下(按代码应该是有一条绿线的)
1.png
3.jpg

离线

#69 2018-11-19 12:47:54

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

Pese 说:
达克罗德 说:
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://debugdump.com/files/members/377/1.png
https://debugdump.com/files/members/377/3.jpg

很奇怪,你全屏画蓝色都可以,没理由画一行不行呀。晕哥发现的我在驱动把480写成400这个问题你改了吗?

离线

#70 2018-11-19 14:34:25

Pese
会员
注册时间: 2017-11-28
累计积分: 13

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

达克罗德 说:
Pese 说:
达克罗德 说:

present是把全屏都更新。你不要每画一个点都更新全屏,而是全部画完才调present

折腾一下,还是不行,不知道为什么,这是什么原因?
代码和显示如下(按代码应该是有一条绿线的)
https://debugdump.com/files/members/377/1.png
https://debugdump.com/files/members/377/3.jpg

很奇怪,你全屏画蓝色都可以,没理由画一行不行呀。晕哥发现的我在驱动把480写成400这个问题你改了吗?

改了,所以看到的是全屏蓝色的,奇怪的是全屏刷一个颜色就可以,可这样画线或画一个矩形,就不行,你有空试试上面画线的代码看看!!

离线

#71 2018-11-21 01:16:56

达克罗德
会员
注册时间: 2018-04-10
累计积分: 404

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

改了,所以看到的是全屏蓝色的,奇怪的是全屏刷一个颜色就可以,可这样画线或画一个矩形,就不行,你有空试试上面画线的代码看看!!

原来是我的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);

webwxgetmsgimg.jpeg

完整fb-f1c100s.c文件

离线

#72 2018-11-21 08:33:48

lilo
会员
注册时间: 2017-10-15
累计积分: 214

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

讨论好激烈, 拍照合影留念!

离线

#73 2018-11-21 19:04:00

Pese
会员
注册时间: 2017-11-28
累计积分: 13

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

达克罗德 说:

改了,所以看到的是全屏蓝色的,奇怪的是全屏刷一个颜色就可以,可这样画线或画一个矩形,就不行,你有空试试上面画线的代码看看!!

原来是我的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);

https://debugdump.com/files/members/729/webwxgetmsgimg.jpeg

完整fb-f1c100s.c文件

厉害了!!

离线

#74 2018-11-27 19:49:44

t01051
会员
注册时间: 2018-11-27
累计积分: 1

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

嘿嘿,过两天试试 ~~

离线

#75 2018-11-30 08:49:19

ldqmoon
会员
注册时间: 2018-05-25
累计积分: 13

Re: F1C100S裸奔framebuffer+PWM+GPIO驱动

支持一下, 之前搞了很长时间,可以只搞出一半来,这次有完整的了

离线

页脚