Allwinner tina 是由全志公司推出的ARM9内核的SOC 适用的开发板原理图见 burn/CherryPi-F1C200S.pdf
burn/boot.bin 来源自 https://gitee.com/LicheePiNano/lv7_rtthread_f1c100s?_from=gitee_search 需要源码自行下载编译即可,这个boot.bin 支持内存启动和norflash启动,由于spi 速率设置为100,也可能norflash 不支持 100M 启动会异常
我自己改造的boot 在 burn/f1c100s_spl_sd_nor_nand_uart1目录下,根据目标板,将boot log 输出到串口1,也可以修改成uart0, 屏蔽掉宏定义即可,我将spi 速度降为50M了,如果自己的nor flash 支持更改可以修改成100M, nand flash 驱动可以读取数据,但是卡在烧录这块 导致没启动成功,其他方式都可以启动成功
包括如下硬件特性:
硬件 | 描述 |
---|---|
芯片型号 | F1C100S |
CPU | ARM9 |
主频 | 408MHz |
片内DDR | 32MB |
板载SPI Nand Flash | 128MB |
环境 | 说明 |
---|---|
PC操作系统 | Windows |
编译器 | arm-none-eabi-gcc version 6.3.1 20170620 (release) |
构建工具 | scons |
git clone https://gitee.com/kasira/f1c200s_rtt_lvgl830.git
可以参考 https://whycan.com/t_9695.html 我写的说明 里面也包含 调试过程中遇得到的一些问题和解决方法
工具栏选择 项目-》构建项目
如果编译正确无误,在Debug会产生rtthread.elf、rtthread.bin文件。其中rtthread.bin需要烧写到设备中进行运行。
1)下载并运行
1.连接USB
2.先按住开发板上的boot按钮再按下RST按钮
3.松开
4.双击burn目录下flashtoram.bat 烧录到内存运行,如果需要烧录到其他地方,可自行编译burn/f1c100s_spl_sd_nor_nand_uart1 下的 boot代码
D:\RT-ThreadStudio\workspace\iboard\burn>.\tools\sunxi-fel.exe spl boot.bin
D:\RT-ThreadStudio\workspace\iboard\burn>.\tools\sunxi-fel.exe -p write 0x80000
00 ..\Debug\rtthread.bin
100% [================================================] 440 kB, 309.2 kB/s
D:\RT-ThreadStudio\workspace\iboard\burn>.\tools\sunxi-fel.exe exec 0x80000000
请按任意键继续. . .
如果编译 & 烧写无误,会在串口1上看到RT-Thread的启动logo信息:
如果您的开发板是CherryPi-F1C200S 直接使用开发板上的串口就行 i2c test CFG_VER GT911 verson 证明gt911 触摸OK last_x =533, last_y=368 触摸读出的坐标
\ | /
- RT - Thread Operating System
/ | \ 4.1.0 build Jun 3 2023 16:37:03
2006 - 2022 Copyright by RT-Thread team
[33m[W/SFUD] [SFUD] Warning: The OS tick(100) is less than 1000. So the flash write will take more time.[0m
[32m[I/SFUD] Warning: Read SFDP parameter header information failed. The gd25qxx is not support JEDEC SFDP.[0m
[32m[I/SFUD] Warning: This flash device is not found or not support.[0m
[32m[I/SFUD] Error: gd25qxx flash device is initialize fail.[0m
[31m[E/SFUD] ERROR: SPI flash probe failed by SPI device spi00.[0m
[32m[I/I2C] I2C bus [i2c0] registered[0m
i2c test CFG_VER:B
GT911 verson: 911_1060
periph_get_pll_clk:600000000
cpu_get_clk:408000000
ahb_get_clk:200000000
apb_get_clk:100000000
clk_divider_set_rate 29491216 198000000 0clk_divider_set_rate 2147040808 198000000 0
ui_init
msh />[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 8 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 5 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
last_x =533, last_y=368
last_x =533, last_y=368
last_x =533, last_y=368
last_x =533, last_y=368
驱动 | 支持情况 | 备注 |
---|---|---|
UART | 支持 | UART 1 |
GPIO | 支持 | / |
clock | 支持 | / |
mmu | 支持 | / |
fb | 支持 | 480*800 |
touch | 支持 | 触摸适配的可能是1024*600的 |
IO号 | 板级包中的定义 |
---|---|
PE8 | USART2 RX |
PE7 | USART2 TX |
PA3 | USART1 RX |
PA2 | USART1 TX |
PE1 | USART0 TX |
PE0 | USART0 RX |
维护人:
微信号: loongfour
Init OK
Boot to SPI mode
Copy Flash offset 64 to RAM 0x8000000 size:2505724
Copy Flash Ok!
Goto 0x80000000 ...
??/?initialize rti_board_start:0 done
initialize rt_hw_spi_init:0 done
initialize rt_hw_wdt_initwatchdog_init
:0 done
\ | /
- RT - Thread Operating System
/ | \ 4.0.3 build May 17 2023
2006 - 2020 Copyright by rt-thread team
do components initialization.
initialize rti_board_end:0 done
initialize rt_hw_spi_flash_with_sfud_init[32m[I/SFUD] Find a Winbond flash chip. Size is 16777216 bytes.[0m
[32m[I/SFUD] gd25qxx flash device is initialize success.[0m
[32m[I/SFUD] Probe SPI flash gd25qxx by SPI device spi00 success.[0m
:0 done
initialize dfs_init:0 done
initialize rt_mmcsd_core_init:0 done
initialize rt_hw_lcd_init:0 done
initialize rt_hw_gpio_init:0 done
initialize rt_hw_i2c_init[32m[I/I2C] I2C bus [i2c0] registered[0m
:0 done
initialize gt9xx_driver_registeri2c test failed attempt 1: 200i2c test failed attempt 2: 200[TP] gt9xx_probe goodix_i2c_test! error
:0 done
initialize rt_work_sys_workqueue_init:0 done
initialize clock_time_system_init:0 done
initialize pthread_system_init:0 done
initialize libc_system_init:0 done
initialize sal_init[32m[I/sal.skt] Socket Abstraction Layer initialize success.[0m
:0 done
initialize cplusplus_system_init:0 done
initialize rt_i2c_core_init:0 done
initialize tina_sdio_init:0 done
initialize main_page_initclk_divider_set_rate 29491216 198000000 0clk_divider_set_rate -2147483648 198000000 0:0 done
initialize finsh_system_init:0 done
periph_get_pll_clk:600000000
cpu_get_clk:408000000
ahb_get_clk:200000000
apb_get_clk:100000000
msh />
boot.bin 合法格式。
f1c100s 对 spi 引导程序是有格式要求的。格式细节我忽略不分析 start.S 内定义。
编译生成 boot.bin 之后用 mksunxi 对其进行校验,并填充相关位置。 让 f1c100s 能够认可 boot.bin ,并执行它。
burn/f1c100s_spl_sd_nor_nand_uart1 下的boot 在编译时会自动mksunxi 校验
boot.bin 逻辑
初始化 CPU 寄存器。 初始化中断状态。 设置中断向量表位置。 赋值中断向量表。 初始化时钟、DRAM、串口。 bl sys_clock_init bl sys_dram_init bl sys_uart_init 读取第二段程序并引导启动。 这里,第二段程序是 RTT。 如果是 uboot ,第二段就是 uboot 第二阶段。 bl sys_copyself 结束 有三种结束情况 1.返回spl 2.启动第二段程序 3.死循环 具体分析 sys_copyself 函数。 获取启动方式,如果不是SPI,那就返回 spl 状态(start.S 内定义)。 从 spi flash 0x00010000 读取 16 字节。
struct {
void (*Exe)(void); // 程序地址?
uint32_t magic; // 魔数 0xaa55aa55
uint32_t rev; // 没有使用。
uint32_t imgLength; // 程序大小。
}head_t;
如果魔数不正确,将进入死循环 while(1)。
正确的情况下。
从 spi flash 0x00010000 读取 imgLength 长度数据到 0x80000000(DRAM);
然后直接跳转到 0x80000000。运行。
对应的第二阶段程序就有需要完成 head_t 头部信息。
RTT 需要修改内容:
start_gcc.S 文件 .vectors
最前面加入 head_t 结构。
b system_vectors ; 第二段程序向量表存放位置。
.long 0xaa55aa55 ; 魔数
.long 0 ; 留空
.long image_size ;
程序大小 image_size 让链接器进行计算即可,不需要另外使用工具进行处理。
修改 link.lds 文件 最前面位置加入
image_start = .;
.bss 段前面加入
__ image_end = .;
最末尾处计算一下
__ image_size PROVIDE(image_size = image_end - image_start);
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。