博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
荔枝派 Nano 全志 F1C100s 编译运行 Linux ubuntu并升级gcc
阅读量:4092 次
发布时间:2019-05-25

本文共 6435 字,大约阅读时间需要 21 分钟。

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

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

编译 U-Boot

下载并安装交叉编译器wget http://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz上边的下载相当慢,不知是不是我这边网络的原因, 我直接windows下迅雷下载了复制到之前建立的共享目录中sudo tar -vxJf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz --directory=/opt/解压到 /opt/目录下sudo vim /etc/bash.bashrc# 在文件末尾 添加以下内容PATH="$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin"# 添加完毕# 使路径生效sudo source /etc/bash.bashrc 注意这里要加sudo ,否则用sudo编译会提示你找不到arm-linux-gnueabi-gcc此时可用arm-linux-gnueabi-gcc -v 进行测试;若普通用户状态下没有成功,通过 sudo su 切换到root用户再尝试;下载并编译u-boot由于用的是荔枝派的小板子, 所以从荔枝派的代码仓库中获取sudo git clone https://github.com/Lichee-Pi/u-boot.git -b nano-v2018.01       #把代码从仓库克隆到本地cd u-boot                                   #进入u-boot目录git branch -a                              #查看分支git checkout nano-v2018.01      #切换到需要的分支make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_spiflash_defconfig# 此处告知make采用arm-linux-gnueabi下的所有交叉编译工具,目标架构为Arm,设定各默认配置为 nano 的spiflash支持版# 若不带spi-flash的板子,请换成 licheepi_nano_defconfigmake ARCH=arm menuconfig   # 进行可视化配置若提示没有curses.h,则需安装libncurses5-dev库sudo apt-get install libncurses5-dev执行编译make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8   # -j8 指8线程编译若提示recipe for target 'scripts/dtc/pylibfdt/_libfdt.so' failed, 缺少python库apt-get install swig python-dev python3-dev4. 升级gcc版本在执行make 时出现报错:Your GCC is older than 6.0 and is not supported ubuntu update gcc-6.1解决方法:更新GCC方法一  下载并自己编译(1)wget http://ftp.gnu.org/gnu/gcc/gcc-6.1.0/gcc-6.1.0.tar.gz   #下载压缩包,可到windows下下载(2)tar -zvxf gcc-6.1.0.tar.gz --directory=/usr/local/                    #解压到 /usr/local目录下(3)cd /usr/local/gcc-6.1.0                                                          #进入目录(4)sudo ./contrib/download_prerequisites                                #下载所需要的文件(5)sudo mkdir build                                                                  #创建build目录(6)cd build                                                                                #进入build迷了路(7)sudo ../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib  #生成Makefile(8)sudo make -j4                                                                      #执行make 过程很慢,耐心等待(9)sudo make install                                                                 #执行make install方法二  下载ubuntu打包好的gcc(1)添加ppa到库         sudo add-apt-repository ppa:ubuntu-toolchain-r/test         sudo apt-get update(2)安装最新版本的gcc9         sudo apt-get install gcc-9 g++-9         sudo apt-get install gcc-9 g++-9(3)更新系统(可选)         sudo apt-get upgrade(4)强制更新软件包到最新版本,并解决缺少的依赖包         sudo apt-get dist-upgrade(5)刷新db并locate         sudo updatedb         sudo ldconfig         locate gcc | grep -E "/usr/bin/gcc-[0-9]"          #此指令可查看所有安装的gcc版本         locate g++ | grep -E "/usr/bin/g\+\+-[0-9]"       #此指令可查看所有安装的g++版本(6)切换gcc/g++版本         我们正常使用的gcc/g++其实都是/usr/bin/gcc和/usr/bin/g++, 他们指向了/usr/bin下真正版本的gcc/g++程序         cd /usr/bin         sudo rm gcc         sudo ln -s gcc-9 gcc         sudo rm g++         sudo ln -s g++-9 g++(7)查看当前gcc/g++版本         gcc  -v         g++  -v

据说是因为 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 没有做这个步骤,也没有任何说明,这不是故意坑么?

烧录

烧录 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/nullprintf "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/nullprintf "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/nullprintf "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/nullprintf "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/nullprintf "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 0sf erase 0 0x1000000reset

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

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

引导 Kernel

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

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

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

setenv bootargs 'console=tty0 console=ttyS0,115200n8'load mmc 0:1 0x80C00000 suniv-f1c100s-licheepi-nano.dtbload mmc 0:1 0x80008000 zImagebootz 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

转载地址:http://fncii.baihongyu.com/

你可能感兴趣的文章
数据库事务
查看>>
JavaScript基础1:JavaScript 错误 - Throw、Try 和 Catch
查看>>
SQL基础总结——20150730
查看>>
SQL join
查看>>
JavaScript实现页面无刷新让时间走动
查看>>
CSS实例:Tab选项卡效果
查看>>
前端设计之特效表单
查看>>
前端设计之CSS布局:上中下三栏自适应高度CSS布局
查看>>
Java的时间操作玩法实例若干
查看>>
JavaScript:时间日期格式验证大全
查看>>
pinyin4j:拼音与汉字的转换实例
查看>>
XML工具代码:SAX从String字符串XML内获取指定节点或属性的值
查看>>
时间日期:获取两个日期相差几天
查看>>
责任链模式 Chain of Responsibility
查看>>
高并发与大数据解决方案概述
查看>>
解决SimpleDateFormat线程安全问题NumberFormatException: multiple points
查看>>
MySQL数据库存储引擎简介
查看>>
处理Maven本地仓库.lastUpdated文件
查看>>
Kafka | 请求是怎么被处理的?
查看>>
Java并发编程1-线程池
查看>>