荔枝派 Nano 全志 F1C100s 编译运行 Linux 笔记

首先是荔枝派的官方文档,写的不是很细,应当说我们必须明确几点:

  • 出厂时 SPI Flash 自带了一个 U-Boot+Linux Kernel(出厂的时候可能烧过了),可直接拿来用。如果希望自己烧固件,才需要后续步骤
  • 必须使用移植版的 sunxi-tools 工具,而非官方版
  • 必须使用移植版的 U-Boot 工具,而非官方版
  • 可以使用最新的主线 Linux 内核
  • 荔枝派 Nano 没有 reset 按钮,且使用的是片内 DDR1 DRAM,大小为 32MB,外部 SPI Flash 为 16MB。芯片架构 ARM926EJ-S

编译 U-Boot

据说是因为 Winbond 涨价了,所以板子上的 SPI Flash 换成了大陆产 xt25f128,需要修改 U-Boot 的 arch/arm/dts/suniv-f1c100s-licheepi-nano.dts

&spi0 {
	pinctrl-names = "default";
	pinctrl-0 = <&spi0_pins_a>;
	status = "okay";

	flash@0 {
		#address-cells = <1>;
		#size-cells = <1>;
		compatible = "winbond,xt25f128", "jedec,spi-nor";
		reg = <0>;
		spi-max-frequency = <40000000>;
	};
};

然后修改 drivers/mtd/spi/spi_flash_ids.c,在 Winbond 节加入:

{"xt25f128",       INFO(0x0b4018, 0x0, 64*1024,    256,    RD_FULL | WR_QPP | SECT_4K) },

移植版的 U-Boot 没有做这个步骤,也没有任何说明,这不是故意坑么?

编译 Busybox

参考 用BusyBox制作Linux最小系统,然后要创建 jffs2 文件系统,因为我使用 initramfs,所以就不做这一步。

编译 Linux

我选用主线 Linux。需要启用如下选项(不会吧,你该不会不知道可以用 / 键进行搜索吧?):

  • CONFIG_ARCH_MULTI_V5:选择 ARM v5,选择了这个以后才能选 F1C100s
  • CONFIG_ARCH_SUNXI:选择全志 SoCs
  • CONFIG_MACH_SUNIV:选择了这个以后才能选 F1C100s
  • CONFIG_AEABI:如果出现错误 Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004 就是因为这个没有选中
  • CONFIG_LOCALVERSION:这个选项用来设置内核启动时显示的额外版本信息,你可以设置为你的名字,看上去像是你的专用版 Linux
  • CONFIG_BLK_DEV_INITRD:启用 initrd/initramfs,这样就可以先不弄 jffs2,而是使用 ramfs
  • CONFIG_INITRAMFS_SOURCE:指向 busybox 生成的目录
  • CONFIG_SPI:启用 SPI
  • CONFIG_MTD:启用 MTD
  • CONFIG_MTD_SPI_NOR:启用 SPI NOR Flash
  • CONFIG_MTD_SPI_NOR_USE_4K_SECTORS:启用 4K 扇区
  • CONFIG_MISC_FILESYSTEMS:启用 JFFS2
  • CONFIG_JFFS2_FS:启用 JFFS2

其他选项不知道就默认就行。编译的时候记得加 -j8 启用 8 线程编译加速。

烧录

烧录 U-Boot 到 SPI Flash 是必须的,至于引导 Linux,可以把 Linux 映像放到 SD、TF 卡中,也可以直接烧到 SPI Flash 中。这里我采用后者。为此,我们准备一个打包脚本(因为我这里使用 initramfs,所以就不需要额外 rootfs 了):

dd if=/dev/zero of=firmware.bin bs=1M count=16 2>/dev/null
printf "create firmware.bin, size 0x%04x\n" $[1024*1024*16]

echo "+======================+"
echo "| Bootloader: 1MB"
echo "+----------------------+"
echo "| dtb:        32KB"
echo "+----------------------+"
echo "| zImage:     8MB"
echo "+----------------------+"
echo "| rootfs:     .MB"
echo "+======================+"

dd if=u-boot/u-boot-sunxi-with-spl.bin of=firmware.bin bs=1k conv=notrunc 2>/dev/null
printf "uboot: 0x0000, size 0x%04x\n" $[1024*1024]

dd if=linux/arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb of=firmware.bin bs=1k seek=1024 conv=notrunc 2>/dev/null
printf "dtb:   0x%04x, size 0x%04x\n" $[1024*1024] $[32*1024]

dd if=linux/arch/arm/boot/zImage of=firmware.bin bs=1k seek=$[1024+32] conv=notrunc 2>/dev/null
printf "zImage: 0x%04x, size 0x%04x\n" $[1024*(1024+32)] $[1024*1024*8]

#dd if=jffs2.img of=firmware.bin bs=1K seek=$((1024+32+8192)) conv=notrunc 2>/dev/null
printf "rootfs: 0x%04x, size 0x%04x\n" $[1024*(1024+32+1024*8)] $[1024*(1024*16 - 1024*9 - 32)]

echo "sf probe 0 50000000 0; sf erase 0 0x1000000; reset"
echo "sudo sunxi-fel -p spiflash-write 0 firmware.bin"

注意这个 dtb 文件应该使用 linux 编译目标 dtbs 生成,而不应该使用 U-Boot 所生成的 dtb 文件。

然后烧录。根据官方的文档,先把 SPI Flash 的 CS 脚拉低,然后芯片进入 FEL 模式后进行操作。测试发现,sunxi-tools 的烧录命令似乎没有进行 erase,导致我后面烧录的时候,里面的数据根本没有变化

因此我们在烧新的 U-Boot 前,应该先进入出厂时的 U-Boot ,用以下命令清空 SPI Flash 的 16MB 空间(注意 0 和 50000000之间没有冒号,别被官方文档骗了):

sf probe 0 50000000 0
sf erase 0 0x1000000
reset

重新上电,由于没有 SPL 头部,芯片会自动进入 FEL 模式。然后就可以使用 sunxi-tools 来烧写了。

这么隐蔽的坑,那感觉,谁试谁知道

引导 Kernel

重新上电,在 U-Boot 中执行:

setenv bootargs 'console=tty0 console=ttyS0,115200n8'
sf probe 0 50000000 0
sf read 0x80C00000 0x100000 0x8000
sf read 0x80008000 0x108000 0x800000
bootz 0x80008000 - 0x80C00000

如果你的内核映像在 SD 卡中:

setenv bootargs 'console=tty0 console=ttyS0,115200n8'
load mmc 0:1 0x80C00000 suniv-f1c100s-licheepi-nano.dtb
load mmc 0:1 0x80008000 zImage
bootz 0x80008000 - 0x80C00000

最终效果

在这里插入图片描述在这里插入图片描述就是在用户登录那里总是有问题,明明已经关闭密码了却还提示密码错误,设置一个有效密码仍然是密码错误,见鬼。最后索性不需要登录了。

自己画板子

https://www.thirtythreeforty.net/posts/2019/12/my-business-card-runs-linux/#source-code

源代码:

https://github.com/thirtythreeforty/businesscard-linux

电路原理图:

https://www.thirtythreeforty.net/posts/2019/12/my-business-card-runs-linux/businesscard.pdf

FC100s 技术文档:

https://www.thirtythreeforty.net/media/F1C100s_Datasheet_V1.0.pdf

https://www.thirtythreeforty.net/media/Allwinner_F1C600_User_Manual_V1.0.pdf

  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
全志F1C100S芯片是一款广泛应用于嵌入式系统的ARM处理器,支持运行Linux操作系统。设备树(Device Tree)作为一种硬件描述语言,被广泛应用于嵌入式系统中,用于描述硬件设备的信息。 要在运行Linux系统的全志F1C100S芯片上添加设备树,需要按照以下步骤进行: 1. 首先,了解全志F1C100S芯片的硬件架构和设备信息。通过查阅芯片的数据手册,获得芯片中的各个设备及其相关寄存器地址、中断信息等。 2. 在Linux内核源码中找到与全志F1C100S芯片相关的设备树文件(一般以.dts或.dtb文件格式存在)。这些文件位于arch/arm/boot/dts目录下。 3. 复制芯片相关的设备树文件,命名为相应的名称。根据需要,在设备树文件中添加新设备的描述。可以参考其他设备的描述,了解设备树的结构和语法规则。 4. 编辑设备树文件,添加新设备的描述信息。根据设备手册中的相关信息,包括设备的名称、地址、中断等,正确地描述设备的各个属性。 5. 编译设备树文件。使用设备树编译器(dtc)将设备树文件编译为设备树二进制文件(.dtb)。 6. 更新内核配置文件。在Makefile或Kconfig文件中,确保设备树文件被正确引用和编译进内核镜像中。 7. 编译内核。使用交叉编译工具链将内核源码编译为可在全志F1C100S芯片上运行的二进制文件。 8. 烧写内核。将编译好的内核镜像烧写到全志F1C100S芯片的存储介质中,如SPI Flash、SD卡等。 9. 启动系统。按照相应的启动方式(如从SPI Flash、SD卡启动),启动全志F1C100S芯片上的Linux系统。 通过以上步骤,我们可以成功地在运行Linux系统的全志F1C100S芯片上添加设备树,使得系统能够正确地识别和管理新添加的设备。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值