WhyCan Forum

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

您尚未登录。

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

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

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
注册时间: 2017-09-06
累计积分: 7,389

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

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

离线

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

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

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

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

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

离线

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

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,389

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

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

离线

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

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

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

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

离线

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

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,389

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

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

离线

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

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

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
累计积分: 186

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
累计积分: 186

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
累计积分: 548

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
累计积分: 548

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

arm9没有hf的

离线

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

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

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
累计积分: 186

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
累计积分: 186

离线

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

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

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

果然顺利编译完成.

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



烧这个demo也一样:
https://whycan.cn/t_1393.html

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

离线

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

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

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

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

离线

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

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,389

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

估计就是这个问题了。

离线

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

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

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

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

离线

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

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

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

awfans 说:

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

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

离线

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

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

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

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

离线

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

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

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

QQ20180821092612.jpg

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

离线

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

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

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

awfans 说:

https://whycan.cn/files/members/713/QQ20180821092612.jpg

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

下面怎么显示蓝色的?

离线

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

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

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

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

离线

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

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,389

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

QQ20180823173248.png

路过, 刚好在调 f1c100s

看了一下代码

估计是楼主手抖了. 

big_smile:D:D

离线

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

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

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

晕哥 说:

https://whycan.cn/files/members/3/QQ20180823173248.png

路过, 刚好在调 f1c100s

看了一下代码

估计是楼主手抖了. 

big_smile:D:D

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

离线

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

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,389

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

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

离线

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

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

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
累计积分: 186

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

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

离线

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

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,389

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
注册时间: 2017-09-06
累计积分: 7,389

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
注册时间: 2017-09-06
累计积分: 7,389

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
注册时间: 2017-09-06
累计积分: 7,389

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
累计积分: 548

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

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

离线

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

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,389

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

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

离线

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

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

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
注册时间: 2017-09-06
累计积分: 7,389

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
注册时间: 2017-09-06
累计积分: 7,389

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
累计积分: 548

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
累计积分: 59

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
注册时间: 2017-09-06
累计积分: 7,389

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
累计积分: 548

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
累计积分: 107

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
累计积分: 107

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

daydayup 说:

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

开新帖分享了裁剪方法,把XBOOT优化到<170kB了。https://whycan.cn/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
累计积分: 548

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
注册时间: 2017-09-06
累计积分: 7,389

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

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

离线

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

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

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
注册时间: 2017-09-06
累计积分: 7,389

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
累计积分: 548

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
累计积分: 548

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
累计积分: 548

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://whycan.cn/files/members/377/1.png
https://whycan.cn/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://whycan.cn/files/members/377/1.png
https://whycan.cn/files/members/377/3.jpg

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

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

离线

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

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

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://whycan.cn/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
累计积分: 14

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

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

离线

#76 2018-12-02 13:38:34

执念执战
会员
注册时间: 2018-11-27
累计积分: 4

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

在大佬的裸机代码基础上移植了ZLG_GUI并显示了旋转立方体。

gifeditor_20181202_114251.gif
可惜大佬没写例子的外设都还没摸索会,不然就多加点功能了。
另外,我想以此写一篇新手裸机教程,可以吗?

离线

#77 2018-12-02 13:46:22

basicdev
会员
注册时间: 2017-10-02
累计积分: 159

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

这个Demo真是666,这个是gif的吗,是不是用zlg gui模拟器导出的gif,方便分享代码吗?

离线

#78 2018-12-02 15:11:51

执念执战
会员
注册时间: 2018-11-27
累计积分: 4

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

basicdev 说:

这个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)

离线

#79 2018-12-02 15:25:24

basicdev
会员
注册时间: 2017-10-02
累计积分: 159

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

执念执战 说:
basicdev 说:

这个Demo真是666,这个是gif的吗,是不是用zlg gui模拟器导出的gif,方便分享代码吗?

想多了,这个是荔枝派屏幕显示,手机拍下来,然后软件转成GIF的,图像质量一下降,颜色都没了,不好看了。
但这个的demo我已经写了教程,在博客园,有源码。 https://www.cnblogs.com/zhinianzhizhan/p/10051013.html   。
就是在荔枝派Nano上面移植显示的,要的话拿去。不过没有你说的GUI自己导出GIF的功能........它没有那么高级,图片显示函数都要自己写,简单的菜单等功能倒是能实现,虽然丑了点。而且我不清楚这个GUI是否免费,纯粹拿来玩。如果你想要你说的功能,得自己写或另外移植支持此功能的GUI了。另外,驱动代码就是本帖子的大神的作品,希望楼主允许。

感谢解惑, 拜读了你的帖子,简直就是小白从入门到精通啊,还提供源码下载。

离线

#80 2018-12-02 16:08:07

执念执战
会员
注册时间: 2018-11-27
累计积分: 4

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

basicdev 说:
执念执战 说:
basicdev 说:

这个Demo真是666,这个是gif的吗,是不是用zlg gui模拟器导出的gif,方便分享代码吗?

想多了,这个是荔枝派屏幕显示,手机拍下来,然后软件转成GIF的,图像质量一下降,颜色都没了,不好看了。
但这个的demo我已经写了教程,在博客园,有源码。 https://www.cnblogs.com/zhinianzhizhan/p/10051013.html   。
就是在荔枝派Nano上面移植显示的,要的话拿去。不过没有你说的GUI自己导出GIF的功能........它没有那么高级,图片显示函数都要自己写,简单的菜单等功能倒是能实现,虽然丑了点。而且我不清楚这个GUI是否免费,纯粹拿来玩。如果你想要你说的功能,得自己写或另外移植支持此功能的GUI了。另外,驱动代码就是本帖子的大神的作品,希望楼主允许。

感谢解惑, 拜读了你的帖子,简直就是小白从入门到精通啊,还提供源码下载。


实在是因为荔枝派吃灰太久,突然有大佬弄了个能入门的东西,所以想让其他还没入门的也感受一下。而且这些都是单片机思维的东西,一般的接触起来也简单。以后学一下更高级的东西再写移植这个立方体的教程。当然,如果楼主能放出点各个驱动的简单使用代码,我还打算弄个小掌机,基于这个3D显示写点小游戏,来更加深入的写点入门帖。可惜,人家能写出来源码,我都不会用,这个差距一下子就出来了......

离线

#81 2018-12-02 17:42:12

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,389

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

执念执战 说:
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寸液晶体验了一把:

离线

#82 2018-12-03 11:12:23

vigour1000
会员
注册时间: 2018-11-19
累计积分: 31

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

裸奔要做成stm32f103那样的标准库方式才好统一研究

离线

#83 2018-12-06 23:32:37

小菜
会员
注册时间: 2018-12-06
累计积分: 34

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

学习

离线

#84 2018-12-11 20:10:42

小菜
会员
注册时间: 2018-12-06
累计积分: 34

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

大侠,我编译的时候出现mksunxi无法编译,还请问大概是什么情况。
我已经使用root用户来编译了,还提示没有权限。
minimal_f1c100s.jpg

离线

#85 2018-12-11 20:31:04

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

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

小菜 说:

大侠,我编译的时候出现mksunxi无法编译,还请问大概是什么情况。
我已经使用root用户来编译了,还提示没有权限。
https://whycan.cn/files/members/1297/minimal_f1c100s.jpg

没遇到过,你试试把sunxitool的可执行文件用chmod 777处理下

离线

#86 2018-12-11 21:23:15

小菜
会员
注册时间: 2018-12-06
累计积分: 34

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

原来是tools/mksunxi/mksunxi没有执行权限。多谢指点。

离线

#87 2018-12-11 21:46:19

小菜
会员
注册时间: 2018-12-06
累计积分: 34

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

编译完的firmware.bin文件可以从SD卡里运行吗?还是必须要烧到flash中?

离线

#88 2018-12-11 22:01:36

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,389

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

小菜 说:

编译完的firmware.bin文件可以从SD卡里运行吗?还是必须要烧到flash中?

不行, spl(boot0)里面没有sd卡驱动,xboot最新的代码或许可以了

离线

#89 2018-12-18 09:04:43

dearsohucom
会员
注册时间: 2018-12-18
累计积分: 4

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

各位真牛逼,吾等在此膜拜!

离线

#90 2019-01-17 10:31:15

duckduckgo
会员
注册时间: 2018-12-13
累计积分: 56

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

ce-f1c100s-timer.c和cs-f1c100s-timer.c这两个有什么区别?

离线

#91 2019-01-17 17:11:18

siwen
会员
注册时间: 2019-01-17
累计积分: 7

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

我想买一款F1C200S的产品拆解一下,求产品链接。

离线

#92 2019-01-17 17:26:56

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,389

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

siwen 说:

我想买一款F1C200S的产品拆解一下,求产品链接。

C100,C500,C600都是同一个die,估计C200也差不多吧

离线

#93 2019-01-18 20:11:15

jw__liu
会员
注册时间: 2019-01-18
累计积分: 40

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

不错受到鼓舞 正在做nuc972的显示代码一天了还没头绪。

离线

#94 2019-01-23 13:45:37

Jin劲
会员
注册时间: 2018-04-06
累计积分: 208

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

A

A

AAAAAAAAAAAA

离线

#95 2019-01-28 13:35:36

xinyu_khan
会员
注册时间: 2019-01-15
累计积分: 31

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

学习了

离线

#96 2019-01-30 18:16:57

0752ben
会员
注册时间: 2019-01-30
累计积分: 5

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

首先感谢楼主的贡献,源码在荔枝派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

离线

#97 2019-01-30 18:25:56

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,389

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

@0752ben 厉害厉害, 感谢分享!

离线

#98 2019-01-30 19:02:33

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

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

那是几个显示相关模块的内部复位管,和时序没什么关系

离线

#99 2019-02-02 22:39:30

0752ben
会员
注册时间: 2019-01-30
累计积分: 5

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

你好,达克罗德
我在修改液framebuffer初始化函数的时候,void fb_f1c100s_init(framebuffer_t * fb)函数中,只要修改了频率参数,  您的代码中 原来pdat->timing.pixel_clock_hz = 33000000 ,只要这个参数一旦修改后,不管是变大还是变小。 F1C100S的LCD_CLK硬件引脚就没有信号输出了。
我尝试了下,查询液晶初始化的其他函数,实在没有发现问题所在。
请问下达克罗德,您的代码从XBOOT中移植出来,是否需要修改什么地方,才可以 实现其他分辨率的刷屏频率。

离线

#100 2019-02-03 08:15:57

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

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

0752ben 说:

你好,达克罗德
我在修改液framebuffer初始化函数的时候,void fb_f1c100s_init(framebuffer_t * fb)函数中,只要修改了频率参数,  您的代码中 原来pdat->timing.pixel_clock_hz = 33000000 ,只要这个参数一旦修改后,不管是变大还是变小。 F1C100S的LCD_CLK硬件引脚就没有信号输出了。
我尝试了下,查询液晶初始化的其他函数,实在没有发现问题所在。
请问下达克罗德,您的代码从XBOOT中移植出来,是否需要修改什么地方,才可以 实现其他分辨率的刷屏频率。

71楼的修改你改了吗
我最近要支持1024x600,成功了我发出来

离线

#101 2019-02-04 20:41:03

0752ben
会员
注册时间: 2019-01-30
累计积分: 5

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

你好,达克罗德。
我的工程替换了71楼的 “完整FB-f1c100s.c文件”,编译成功后,修改pdat->timing.pixel_clock_hz  ,情况是一样的,LCD_CLK硬件引脚就没有信号输出。

离线

#102 2019-02-10 02:01:11

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

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

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能设置成更高时钟了

离线

#103 2019-02-21 22:18:24

www220
会员
注册时间: 2018-02-09
累计积分: 46

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

有usb开源资料就爽了

离线

#104 2019-03-04 16:30:40

0752ben
会员
注册时间: 2019-01-30
累计积分: 5

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

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

离线

#105 2019-03-04 19:35:14

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

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

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

不好意思,实在没有时间,我只是业余玩玩,研究也很浅

离线

#106 2019-03-04 20:04:11

0752ben
会员
注册时间: 2019-01-30
累计积分: 5

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

达克罗德,谢谢你的回复

离线

#107 2019-03-05 09:42:18

www220
会员
注册时间: 2018-02-09
累计积分: 46

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

这种级别芯片跑裸奔实在太累了

离线

#108 2019-04-29 10:24:31

Aysi
会员
注册时间: 2019-04-03
累计积分: 7

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

你好!定时器中断和UART中断试过吗?串口初始化时加了    接收中断
val = read32(addr + 0X04);
write32(addr + 0x04, val|0x01);
T0定时器按晕哥的MDK裸奔配置了,,
但老是没反应,,,是配置错吗?中断是在arm32_do_irq中处理吗?还有什么要修改?

离线

#109 2019-06-14 10:15:42

duckduckgo
会员
注册时间: 2018-12-13
累计积分: 56

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

非常好。
这个是裸机的,请问想在 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)

离线

#110 2019-06-14 17:48:48

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

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

你把最终要的头信息都丢了

    .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对头信息处理一下

离线

#111 2019-06-14 18:07:28

Jin劲
会员
注册时间: 2018-04-06
累计积分: 208

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

达克罗德 说:

你把最终要的头信息都丢了

    .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配置了

离线

#112 2019-06-14 18:35:39

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

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

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也就没用了

离线

#113 2019-06-14 21:19:42

Jin劲
会员
注册时间: 2018-04-06
累计积分: 208

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

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

离线

#114 2019-06-14 22:06:24

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

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

brom应该不拷贝这个头,我记得这个头会填上跳转地址的,所以brom知道怎么跳

离线

#115 2019-07-12 07:42:11

hzpyl
会员
注册时间: 2019-07-10
累计积分: 79

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

裸奔的例子。

离线

#116 2019-07-12 14:08:36

hzpyl
会员
注册时间: 2019-07-10
累计积分: 79

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

下载程序到荔枝派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 在什么地方能执行?

离线

#117 2019-07-12 14:32:37

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,389

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

你说的是这个吧: https://www.cnblogs.com/zhinianzhizhan/p/10051013.html

我看了一下, 实际上应该可以不去执行 sudo su

离线

#118 2019-07-12 14:45:04

hzpyl
会员
注册时间: 2019-07-10
累计积分: 79

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

晕哥,是这个网址。
这个网址的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
这个需要在什么地方运行? 麻烦你,能截个图吗?

离线

#119 2019-07-12 15:01:42

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,389

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

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 编译命令.


你可以在命令窗口直接运行.

离线

#120 2019-07-12 15:41:51

hzpyl
会员
注册时间: 2019-07-10
累计积分: 79

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

QQ20190712153930.png

是不是需要进入Linux系统,才能用这个命令?
WINDOWS 下的不能用的?

离线

#121 2019-07-12 16:03:23

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,389

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

嗯, 对的, 需要 Linux 系统。

建议先去看下 Ubuntu + 嵌入式编程入门的书籍或者视频(http://www.bilibili.com/)

离线

#122 2019-07-13 20:39:58

hzpyl
会员
注册时间: 2019-07-10
累计积分: 79

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

“荔枝派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)

离线

#123 2019-07-13 22:07:39

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,389

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

我前面说错了, 如果只编译楼主的项目或者 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等。

离线

#124 2019-07-31 18:10:29

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

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

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

离线

#125 2019-07-31 20:20:25

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

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

不可能这么高分辨率,内存带宽还有CPU主频限制了

离线

#126 2019-08-09 15:40:57

linhuaou
会员
注册时间: 2019-08-09
累计积分: 11

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

F1C100S 的RTT Keil/IAR工程怎么生成的?RTT的env下运行scons --target=iar的提示如下--
> scons --target=iar
scons: Reading SConscript files ...
Please make sure your toolchains is GNU GCC!

离线

页脚