前言
最早接触到F1C100s是前两年的一个文章,里面使用F1C100s制作了一张可以运行Linux的名片,就是下图这个。下图上实际电路部分就占用角落一点点面积,当时觉得蛮有意思的的,可以跑Linux的开发板可以做这么小,成本和常见单片机最小系统板差不多,用来玩挺有意思的。
在这里文章里了解到 Sipeed Lichee Nano (荔枝派Nano),这个差不多可以当作F1C100s的最小系统板板用了,某宝一搜一大片,当时价格还不错,这两年因为疫情等各种原因价格上涨不少。
这篇文章将介绍下上手玩F1C100s需要的一些基础信息,方便回头查询使用。
资料来源
- linux-sunxi community
https://linux-sunxi.org/Main_Page
全志SoCs社区linux wiki,全志除了新出的基于RISC-V的D1,其它的芯片资料都是不开放的,mainlinux相关的开发都是由社区维护的,主要资料就是在这里;
全志的芯片都以sunxi
来指代,后面凡是看到sunxi
或是sun*
的内容可能就是全志相关的内容;
比如F1C100s就关联 suniv ;
https://linux-sunxi.org/F1C100s
上面可以下载到F1C100s芯片的一些文档; - WhyCan Forum(哇酷开发者社区)
https://whycan.com/index.html
这个论坛虽然嵌入式相关的内容都有涉及,但目前主要还是全志相关的内容多些;
https://whycan.com/t_717.html
上面这篇文章中有很多F1C100s相关的例子资料等;
https://whycan.com/t_3177.html
F1C100s开发时的一个坑,编译工具链引起的问题; - 荔枝派Nano 全流程指南 与 资料下载
https://wiki.sipeed.com/soft/Lichee/zh/Nano-Doc-Backup/index.html
https://dl.sipeed.com/shareURL/LICHEE/Nano - My Business Card Runs Linux
https://www.thirtythreeforty.net/posts/2019/12/my-business-card-runs-linux/
这个就是开头说的那个可以运行Linux的名片的文章;
u-boot & linux
F1C100s玩的最多的就是拿来搞Linux玩,重要的是针对该芯片的uboot和linux的修改,这里收集了一些主要的项目:
u-boot
- https://github.com/Icenowy/u-boot
这个项目有 f1c100s 和 f1c100s-spiflash 两个分支,后者更加新点;
分支中有 licheepi_nano_defconfig 和 licheepi_nano_spiflash_defconfig 两个配置文件; - https://github.com/Lichee-Pi/u-boot
这个项目包含荔枝派所有的u-boot,对于F1C100s而言则是在前面项目的 f1c100s-spiflash 分支基础上新增了 nano-lcd800480 分支,增加了对lcd的支持;
linux
- https://github.com/Icenowy/linux
这个项目主要查看 f1c100s 分支; - https://github.com/Lichee-Pi/linux
这个项目目前主要查看 nano-4.14-exp 、 nano-5.2-tf 、 nano-5.2-flash 三个分支;
nano-4.14-exp 分支是在前面项目的基础上修复了一个bug,这个分支可以下载 https://dl.sipeed.com/fileList/LICHEE/Nano/SDK/config 这个配置文件进行测试;
基础特性
F1C100s是全志的一颗比较便宜的芯片,其功能框图如下:
典型应用如下:
F1C100s的内核是 ARM926EJ-S ,ARMv5架构,有MMU,没有硬件FPU,主频默认为408MHz;
F1C100s内置32MB DDR1内存;
F1C200s是F1C100s的兄弟型号,其它特性都相同,内存容量翻倍为64MB;
F1C100s和F1C200s价格便宜的时候可以在1~2刀左右,带有LCD、摄像头、音频、视频等接口,还内置几十兆内存,用来简单的点屏使用比单片机之类的好多了。所以经常可以看到用F1C100s来做行车记录仪或是复古游戏机等产品。
启动过程
F1C100s的启动过程在它流出的手册中并没有找到相关描述,在 全志V3s 的 DataSheet 的 4.2. Boot System 章节中倒是有相似描述,可以作为参考:
芯片上电启动后,芯片会先执行内部固化的程序(BROM),该程序会依次检查外部存储器是否可用,如果可用再从中加载第二阶段程序(SPL)并执行。如果前面过程失败了则会进入全志系列处理器内置的FEL模式。
对于F1C100s而言启动时寻找用户程序的位置顺序如下:
- SDC0接口(PF0~PF5)上的SD(TF)卡;
- SPI0接口(PC0~PC3)上的Nor Flash;
- SPI0接口(PC0~PC3)上的Nand Flash;
对于SD(TF)卡而言在它上面的数据存储布局通常如下:
start | sector | size | usage |
---|---|---|---|
0KB | 0 | 8KB | Unused, available for an MBR or (limited) GPT partition table |
8KB | 16 | 32KB | Initial SPL loader |
40KB | 80 | Max 984KB | U-Boot |
1MB | 2048 | - | bootfs and rootfs |
上面参数中SPL从8K位置开始不能动(这是由BROM决定的);文件系统可以根据需要来分区,boot分区在前,通常为FAT格式。
如果使用上文列出的那些 u-boot 项目,编译后会得到 u-boot-sunxi-with-spl.bin 这个文件会拼合 spl 和 u-boot ,直接把这个文件写入到 8KB 开始的位置就行了。
更多内容可以参考:https://linux-sunxi.org/Bootable_SD_card
对于SPI Flash而言其实和SD(TF)卡而言差不多,最关键的就是将 u-boot-sunxi-with-spl.bin 文件放在头部,即从0位置开始写入;其它内容根据需求而设置,只要对应的调整 u-boot 读取启动内核时相关位置参数就行。
需要注意的是默认情况下SPI Flash最大支持16M,更大就需要在程序中设置bank了。
FEL模式
上文中可以了解到F1C100s要是启动外部程序均失败的话就会进入FEL模式,用户可以通过USB和芯片进行交互 。在FEL模式你可以直接运行 u-boot 和 linux 等,也可以将数据写入spiflash中(可以用作烧录固件到设备中)。
FEL模式其实也就是BROM上的一段程序,可以在 u-boot
命令行中使用 go 0xffff0020
跳转进入。另外也可以通过在SD(TF)卡写入下面数据来通过SD(TF)卡启动跳转:
# sdX 为SD(TF)卡,使用 sudo fdisk -l 查看
# 如果有自动挂载的分区则逐条使用 sudo umount /dev/sdXn 进行卸载
wget https://github.com/linux-sunxi/sunxi-tools/raw/master/bin/fel-sdboot.sunxi
sudo dd if=fel-sdboot.sunxi of=/dev/sdX bs=1024 seek=8
如果外接了SPI Flash,并且SPI Flash中有可运行的程序的话可以将F1C100s的 Pin60 - PC1 - SPI0_CS 即 SPI Flash 的 1 脚接地后进入FEL模式。
为了和FEL模式下的芯片交互我们还需要用到 sunxi-tools 工具包,针对运行程序或烧录等操作需要用到其中的 sunxi-fel 工具,工具包项目地址如下:
https://github.com/Icenowy/sunxi-tools
针对F1C100s的 sunxi-fel 工具可以使用下面方式下载、编译、安装:
sudo apt install pkg-config zlib1g-dev libusb-1.0-0-dev
git clone https://github.com/Icenowy/sunxi-tools.git -b f1c100s-spiflash
cd sunxi-tools
make
# 编译完成后可以使用下面方式安装到系统目录
# sudo make install
# 不过其实不推荐安装到系统目录,因为全志不同的芯片需要用不同分支的sunxi-tools
# 更加推荐使用时临时添加环境目录,比如下面这样
# export PATH=$PATH:sunxi-tools目录路径
# 这种方式使用时需要用下面方式
# sudo `which sunxi-fel` [-选项] 命令 参数
安装完成后可以使用 sudo sunxi-fel -l
列出所有处于FEL模式的设备、使用 sudo sunxi-fel ver
设备 BROM 信息:
可以使用 sudo sunxi-fel uboot /path/u-boot-sunxi-with-spl.bin
来直接运行u-boot程序;
可以使用 sudo sunxi-fel -p spiflash-write addr file
(addr常用0)将数据写入spiflash(注意最大16M,再大可能需要改程序)。
Usage: ./sunxi-fel [options] command arguments... [command...]
-v, --verbose Verbose logging
-p, --progress "write" transfers show a progress bar
-l, --list Enumerate all (USB) FEL devices and exit
-d, --dev bus:devnum Use specific USB bus and device number
--sid SID Select device by SID key (exact match)
spl file Load and execute U-Boot SPL
If file additionally contains a main U-Boot binary
(u-boot-sunxi-with-spl.bin), this command also transfers that
to memory (default address from image), but won't execute it.
uboot file-with-spl like "spl", but actually starts U-Boot
U-Boot execution will take place when the fel utility exits.
This allows combining "uboot" with further "write" commands
(to transfer other files needed for the boot).
hex[dump] address length Dumps memory region in hex
dump address length Binary memory dump
exe[cute] address Call function address
reset64 address RMR request for AArch64 warm boot
readl address Read 32-bit value from device memory
writel address value Write 32-bit value to device memory
read address length file Write memory contents into file
write address file Store file contents into memory
write-with-progress addr file "write" with progress bar
write-with-gauge addr file Output progress for "dialog --gauge"
write-with-xgauge addr file Extended gauge output (updates prompt)
multi[write] # addr file ... "write-with-progress" multiple files,
sharing a common progress status
multi[write]-with-gauge ... like their "write-with-*" counterpart,
multi[write]-with-xgauge ... but following the 'multi' syntax:
<#> addr file [addr file [...]]
echo-gauge "some text" Update prompt/caption for gauge output
ver[sion] Show BROM version
sid Retrieve and output 128-bit SID key
clear address length Clear memory
fill address length value Fill memory
对于Windows上装虚拟机来操作的话这之间还有一个坑:默认情况下FEL模式的USB设备Windows是无法识别的,这样就更没法传递给虚拟机使用了。这个问题可以使用 https://zadig.akeo.ie/ 这个工具来安装驱动解决(主要关注VID和PID就行):
除了 sunxi-fel ,也可以使用第三方的 XFEL 工具来进行FEL模式下的交互操作, XFEL 还有提供windows版本的可执行文件。项目地址如下:
https://github.com/xboot/xfel
关于FEL模式的更多内容可以参考下面链接:
https://linux-sunxi.org/FEL
https://linux-sunxi.org/FEL/USBBoot
电路设计
电路设计上主要有下面一些注意点:
- SD(TF)卡连接在SDC0
Pin53 - PF5 - SDC0_D2
Pin54 - PF4 - SDC0_D3
Pin55 - PF3 - SDC0_CMD
Pin56 - PF2 - SDC0_CLK
Pin57 - PF1 - SDC0_D0
Pin58 - PF0 - SDC0_D1
- SPI Flash连接在SPI0
Pin59 - PC0 - SPI0_CLK
Pin60 - PC1 - SPI0_CS
Pin61 - PC2 - SPI0_MISO
Pin62 - PC3 - SPI0_MOSI
- FEL模式通过USB通讯
Pin68 - USB-DM
Pin69 - USB-DP
- 控制台交互通过UART0
Pin48 - PE1 - UART0_TX
Pin49 - PE0 - UART0_RX
- 供电
VCC-CORE - 1.0~1.2V
VCC-DRAM - 2.3~2.7V
SVREF - 通过电阻将VCC-DRAM分压成一半
AVCC - 2.5~3.1V
VCC-IO / UVCC / HPVCC / TV_VCC - 2.5~3.1V
电路设计上可以参考 荔枝派Nano 的原理图(可以点击查看大图):
如果对电路功能上没啥需求,只需要跑个Linux玩的话可以参考 Business Card 的原理图(可以点击查看大图):