热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

【linux项目】licheenanolinux烧写

目录前言参考:安装交叉编译链搭建SPIFLASH烧录环境让芯片进入烧写模式sunxi烧写命令u-boot裁剪拉取u-boot源码配置u-boot检查flash驱动编译、烧写u-bo

目录





    • 前言

    • 参考:

    • 安装交叉编译链

    • 搭建 SPI FLASH 烧录环境

    • 让芯片进入烧写模式

    • sunxi 烧写命令

    • u-boot 裁剪

      • 拉取 u-boot 源码

      • 配置 u-boot

      • 检查 flash 驱动

      • 编译、烧写 u-boot



    • linux 裁剪

      • 获取 linux 源码

      • 配置 linux

      • 配置设备树

      • 编译、烧写 linux



    • roofs 裁剪

      • 获取 buildroot 源码

      • 配置 buildroot

      • 编译、烧写 buildroot



    • SPI FLASH 编译烧写

      • 根据自己的配置进行分区

      • 单个烧写

      • 打包成一个文件



    • 小知识



  • uboot sf 命令用法



      • uboot bootz 参数








前言

lichee_nano 主控芯片为全志 FC1001S。

本笔记暂时以 lichee nano 为例子,以后可能会直接适配各类 FC1001S 的板子。

注意:使用 lichee nano 板子和 lichee 提供的镜像时,需要注意这个板子的 flash 芯片型号,必要时需要修改驱动。

李柱明博客:https://www.cnblogs.com/lizhuming/p/15487208.html


参考:



  • 荔枝派 nano 全流程指南

    • lichee 提供了很多脚本,可以拿出来参考。



  • 荔枝派环境搭建


安装交叉编译链

arm-linux-gnueabi



  • 可以自己安装需要的版本。

  • 也可以参考下面例子:

    • 该工具链存放位置自定义。

    • 其中环境变量生命周期参考:环境变量生命周期



# 此处为获取7.2.1版本,您可获取其他版本或者通过链接直接下载
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
tar -vxJf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz
sudo cp -r ./gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi /opt/
sudo vim /etc/bash.bashrc
# 在文件末尾 添加以下内容
PATH="$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin"
# 添加完毕
# 使路径生效
source /etc/bash.bashrc

安装好交叉编译链后可用命令 arm-linux-gnueabi-gcc -v 测试是否安装成功。注意自己的安装用户。


搭建 SPI FLASH 烧录环境

安装好编译根据链后还需要安装烧录固件工具。这里使用 sunxi-tools

# 0. 如果无安装git 首先安装git
sudo apt-get install git
# 1. 拉取 sunxi-tools 这个库
git clone -b f1c100s-spiflash https://github.com/Icenowy/sunxi-tools.git
# 2.进行安装
cd sunxi-tools
make && sudo make install
# 3. 错误处理
# 3.1 如果出现 fatal error: libusb.h: No such file or directory 错误
sudo apt-get install libusb-1.0-0-dev
# 3.2 fel.c:32:18: fatal error: zlib.h: 没有那个文件或目录
sudo apt-get install zlib-devel
# 4. 不出意外 现在已经安装成功, 可以使用这个软件进行烧写。常用的命令有如下几个
# 4.1 查看芯片是否开启了下载模式, 如果出现芯片信息既可以烧录
sudo sunxi-fel ver
# 4.2 烧录到 flash
sudo xunxi-fel -p spiflash-write [烧录的地址] [烧录的文件]
# 4.3 烧录到 内存中
sudo xunxi-fel -p write [烧录的内存地址] [烧录的文件]

让芯片进入烧写模式

为了让芯片能接收烧写固件,可让芯片进入 fel 模式。



  • 原理:当 flash 中无 引导数据或者无法找到 flash 芯片时, 便自动进入 fel 模式

  • 有一下两种方法:

    1. 短接 flash 的 1、4 两脚,重新上电,让芯片找不到 flash,上电后松开短接,即可重新进入 fel 模式。

    2. 使用 U-boot 删除 flash 中的引导数据:



# 在 u-boot 中使用如下指令进行删除数据
# 1. 切换到 flash, 其中 0 为选择的flash,50000000 为速度。官方文档这里有错误。注意!
sf probe 0 50000000
# 2. 擦除flash, 为什么擦除这段地址,请查看spiflash编译章节
sf erase 0 0x10000
# 3. 重启
reset
# 4. 使用 sunxi-fel ver 即可找到芯片
sudo sunxi-fel ver
AWUSBFEX soc=00001663(F1C100s) 00000001 ver=0001 44 08 scratchpad=00007e00 00000000 00000000

sunxi 烧写命令



  1. 确认是否进入 fel 模式命令:sudo sunxi-fel ver

  2. 烧录命令:sudo sunxi-fel -p spiflash-write [烧录的地址] [烧录的文件]


u-boot 裁剪


拉取 u-boot 源码

# 1. 使用git 拉取 u-boot, 这里可以使用加速
git clone https://github.com/Lichee-Pi/u-boot.git
# 2. 查看分支,并切换到对应分支
git branch -a
git checkout nano-v2018.01
# 3. 进行配置
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_spiflash_defconfig

配置 u-boot

按需裁剪,一下为参考:



  • 了解下下面的 bootcmd 参数。就是驱动内核前执行的命令。一般主要做数据拷贝&执行启动,如把设备树、kernel 拷贝到内存控制器 RAM 中。

# 1. 进行可视化配置, 进入配置页面
make ARCH=arm menuconfig
# 1.1 如何出现错误,安装如下的包
sudo apt-get install libncurses5-dev libncursesw5-dev
# 2. 如果使用LCD,修改LCD选项
ARM architecture
Enable graphical uboot console on HDMI, LCD or VGA -> Y
LCD panel timing details -> x:800,y:480,depth:18,pclk_khz:33000,le:87,ri:40,up:31,lo:13,hs:1,vs:1,sync:3,vmode:0
# 如果为 480*272 屏幕
x:480,y:272,depth:18,pclk_khz:10000,le:42,ri:8,up:11,lo:4,hs:1,vs:1,sync:3,vmode:0
LCD panel backlight pwm pin -> PE6 # 具体看原理图
# 3. 修改 boot arguments ,传输到linux的参数
Enable boot arguments -> y
Boot arguments -> cOnsole=ttyS0,115200 panic=5 rootwait root=/dev/mtdblock3 rw rootfstype=jffs2

# 4. 修改bootcmd,启动linux命令。可以具体了解一下 bootcmd 代码的含义,其中拷贝数据启动linux
Enable a default value for bootcmd -y
bootcmd -> sf probe 0 50000000; sf read 0x80c00000 0x100000 0x4000; sf read 0x80008000 0x110000 0x400000; bootz 0x80008000 - 0x80C00000
# 5. 保存退出

检查 flash 驱动



  • 添加自己的 FLASH 芯片驱动。

# 1. 在代码编辑器中 打开 ./drivers/mtd/spi/spi_flash_ids.c
# 2. 在 170 行左右添加如下代码
{"xt25f128b", INFO(0x0b4018, 0x0, 64 * 1024, 256, RD_FULL | WR_QPP | SECT_4K) },
# 3. 保存退出

编译、烧写 u-boot

编译:

# 编译代码
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j11
# 如果最后出现下面语句,编译成功
BINMAN u-boot-sunxi-with-spl.bin
# 错误处理,scripts/Makefile.build:425: recipe for target 'scripts/dtc/pylibfdt' failed
sudo apt-get install swig python-dev python3-dev

编译成功的文件在 u-boot 目录下的,u-boot-sunxi-with-spl.bin 。 把他们烧写到内存或者 flash:

# 烧写到flash中
sudo sunxi-fel -p spiflash-write 0 u-boot-sunxi-with-spl.bin
# 烧写到 sram 中,在测试的时候使用(掉电不保护)
sudo sunxi-fel uboot u-boot-sunxi-with-spl.bin

验证:

# 测试 flash 是否成功,如果出现下面代码既成功
sf probe 0 50000000
SF: Detected xt25f128b with page size 256 Bytes, erase size 4 KiB, total 16 MiB
# 测试 读取
boot

linux 裁剪


获取 linux 源码

目前获取 uboot 和 linux 源码都是获取 lichee 或者全志官方推荐的。

# 1. 因为 linux太大了,建议只拉取单个分支. 可以使用加速
git clone --depth=1 -b f1c100s-480272lcd-test https://github.com/Icenowy/linux.git
# 2. 下载 .config 文件,放到源码的目录下,如果文件名称有变化。改为 .config

替换 .config 文件:.config

git 拉取有时速度很慢,建议做如下配置:

sudo vim /etc/hosts
# 添加下面两行
192.30.253.112 github.com
151.101.73.194 github.global.ssl.fastly.net
# 添加完成
# 可自行通过dns检测网站检测github.global.ssl.fastly.net,更换为更快的ip地址

配置 linux

# 1. 图形化配置
make ARCH=arm menuconfig
# 2. 配置 spiflash
Device Drivers
SPI support
Allwinner A10 SoCs SPI controller ->n # 不选择
Allwinner A31 SPI Controller -> y
# 3. 配置 MTD
Device Drivers
Memory Technology Device (MTD) support
Command line partitioning table parsing -> y
Caching block device access to MTD devices -> y
# 4.添加 File systems
File systems
Miscellaneous filesystems
Journalling Flash File System v2 (JFFS2) support -> y
# 下面全选
# 5. 保存退出
# 注意, 要把配置的选项选择为 * 而不是 M

配置设备树



  • 添加 flash 驱动,需要查看板子使用的 flash 芯片:

    # 1. 打开 ./drivers/mtd/spi-nor/spi-nor.c 1186行. 添加如下代码. 对flash支持
    { "xt25f128b", INFO(0x0b4018, 0, 64 * 1024, 256, 0) },


  • 配置设备树,若无显示器,则显示部分不用配置:

    # 1. 打开 /arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dts 文件
    # 2. 修改 显示驱动
    panel: panel {
    # 修改为 800*480 的屏幕
    compatible = "lg,lb070wv8", "simple-panel";
    #address-cells = <1>;
    #size-cells = <0>;
    enable-gpios = <&pio 4 6 GPIO_ACTIVE_HIGH>;
    port@0 {
    reg = <0>;
    #address-cells = <1>;
    #size-cells = <0>;
    panel_input: endpoint@0 {
    reg = <0>;
    remote-endpoint = <&tcon0_out_lcd>;
    };
    };
    };
    # 3. 添加对spiflash支持
    &spi0 {
    pinctrl-names = "default";
    pinctrl-0 = <&spi0_pins_a>;
    status = "okay";
    spi-max-frequency = <50000000>;
    flash: xt25f128b@0 {
    #address-cells = <1>;
    #size-cells = <1>;
    compatible = "winbond,xt25f128b", "jedec,spi-nor";
    reg = <0>;
    spi-max-frequency = <50000000>;
    partitions {
    compatible = "fixed-partitions";
    #address-cells = <1>;
    #size-cells = <1>;
    partition@0 {
    label = "u-boot";
    reg = <0x000000 0x100000>;
    read-only;
    };
    partition@100000 {
    label = "dtb";
    reg = <0x100000 0x10000>;
    read-only;
    };
    partition@110000 {
    label = "kernel";
    reg = <0x110000 0x400000>;
    read-only;
    };
    partition@510000 {
    label = "rootfs";
    reg = <0x510000 0xAF0000>;
    };
    };
    };
    };



编译、烧写 linux

编译 linux:



  • 镜像文件生成在 arch/arm/boot/zImage

  • 设备树文件在 arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb

  • 编译步骤:

    # 1. 编译
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j11
    # 错误处理 fatal error: openssl/bio.h:
    sudo apt-get install libssl-dev


单独编译设备树:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs -j11

烧写:



  1. 进入 fel 模式。

  2. 烧写固件:sudo sunxi-fel -p spiflash-write [烧录的地址] [烧录的文件]


roofs 裁剪

整理的 rootfs 使用 buildroot 。


获取 buildroot 源码

步骤:



  1. 在 https://buildroot.org/download.html 可以下载到最新的代码包。

  2. 解压这个代码包 tar -xzvf buildroot-2021.08.tar.gz1


配置 buildroot

# 1. 打开图形化界面
make menuconfig
# 2. 选择处理器
Target options
Target Architecture (ARM (little endian))
Target Variant arm926t
# 3. 启动软链接等
System configuration
Use syslinks to /usr .... # 启动 链接
Enable root login # root 登录
Run a getty after boot # 输入密码
remount root filesystem # 重新挂载根文件系统到可读写

编译、烧写 buildroot

编译:

# 编译比较慢,可以配老婆/女朋友聊聊天。 如果编译不成功 make clean 重来
make

编译完成的根目录在 output/images/rootfs.tar . 复制出来解压:

# 复制出来
cp output/images/rootfs.tar ../
# 创建跟目录文件夹
mkdir rootfs
# 解压到这个文件夹
tar -xvf rootfs.tar -C rootfs/
# 安装 jffs2
sudo apt-get install mtd-utils
# 制作镜像, 得到 jffs2.img 可以烧录到开发板
mkfs.jffs2 -s 0x100 -e 0x10000 --pad=0xAF0000 -d rootfs/ -o jffs2.img

烧写:



  1. 进入 fel 模式。

  2. 烧写固件:sudo sunxi-fel -p spiflash-write [烧录的地址] [烧录的文件]


SPI FLASH 编译烧写


根据自己的配置进行分区

如:





































分区序号分区大小分区作用地址空间及分区名
mtd01MB (0x100000)spl+uboot0x0000000-0x0100000 : “uboot”
mtd164KB (0x10000)dtb 文件0x0100000-0x0110000 : “dtb”
mtd24MB (0x400000)linux 内核0x0110000-0x0510000 : “kernel”
mtd3剩余 (0xAF0000)根文件系统0x0510000-0x1000000 : “rootfs”

单个烧写



  • u-boot 烧写到第一分区

    sudo sunxi-fel -p spiflash-write 0 u-boot-sunxi-with-spl.bin


  • dtb 文件烧写到第二分区

    sudo sunxi-fel -p spiflash-write 0x0100000 suniv-f1c100s-licheepi-nano.dtb


  • zImage 镜像文件烧写到第三分区

    sudo sunxi-fel -p spiflash-write 0x0110000 zImage


  • 我们把 根文件系统 烧写到第四分区

    sudo sunxi-fel -p spiflash-write 0x0510000 jffs2.img



打包成一个文件

上面是一个一个固件烧写,我们可以通过脚本把其打包成一个固件进行烧写:

创建一个专门放固件的目录,如 my_bin。在该目录下按下面格式创建文件夹并存放对应固件:



  1. ls

    buildroot linux u-boot


  2. 把下面脚本文件放到 my_bin 目录下,执行,output 为最后输出的文件。

    #! /bin/bash
    rm -rf ./output
    mkdir ./output
    rm -rf ./rootfs
    mkdir ./rootfs
    dd if=/dev/zero of=flashimg.bin bs=1M count=16 &&\
    dd if=./u-boot/u-boot-sunxi-with-spl.bin of=flashimg.bin bs=1K cOnv=notrunc &&\
    dd if=./linux/suniv-f1c100s-licheepi-nano.dtb of=flashimg.bin bs=1K seek=1024 cOnv=notrunc &&\
    dd if=./linux/zImage of=flashimg.bin bs=1K seek=1088 cOnv=notrunc &&\
    tar -xf ./buildroot/rootfs.tar -C ./rootfs &&\
    mkfs.jffs2 -s 0x100 -e 0x10000 --pad=0xAF0000 -d rootfs/ -o jffs2.img &&\
    dd if=jffs2.img of=flashimg.bin bs=1K seek=5184 cOnv=notrunc
    mv flashimg.bin ./output
    rm -rf jffs2.img


  3. 执行命令烧录到开发板:

    sudo sunxi-fel -p spiflash-write 0 flashimg.bin



小知识


uboot sf 命令用法

uboot 中如果支持 spi/qspi flash, 那么可以使用 sf 的 erase, read, write 命令操作 spi flash。



  • sf read 用来读取 flash 数据到内存。

  • sf write 写内存数据到 flash。

  • sf erase 擦除指定位置,指定长度的 flash 内容, 在进行写 flash 的时候一定要先进行擦除,否则会失败,因为 flash 只能从 1 变为 0。

具体参考:

sf - SPI flash sub-system
Usage:
sf probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus and chip select
sf read addr offset len - read `len' bytes starting at
`offset' to memory at `addr'
sf write addr offset len - write `len' bytes from memory
at `addr' to flash at `offset'
sf erase offset [+]len - erase `len' bytes from `offset'
`+len' round up `len' to block size
sf update addr offset len - erase and write `len' bytes from memory
at `addr' to flash at `offset'

使用注意:



  1. 在使用 sf 的其他命令之前必须先使用 sf probe 操作进行连接 flash。

    1. 如:sf probe 0 50000000,初始化总线 0 上的 FLASH,且速度为 50000000 Hz。




uboot bootz 参数

对于 ARM 来讲,可以透过 bootz 的命令来启动内核。



  • 第一个参数为内核映像的地址。

  • 第二个参数为 initrd 的地址,若不存在 initrd,可以用 - 代替。

  • dtb_address 作为 bootz 或者 bootm 的最后一次参数。


原文链接:https://www.cnblogs.com/lizhuming/p/15487208.html



推荐阅读
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • CMake跨平台开发实践
    本文介绍如何使用CMake支持不同平台的代码编译。通过一个简单的示例,我们将展示如何编写CMakeLists.txt以适应Linux和Windows平台,并实现跨平台的函数调用。 ... [详细]
  • 在Ubuntu 16.04 LTS上配置Qt Creator开发环境
    本文详细介绍了如何在Ubuntu 16.04 LTS系统中安装和配置Qt Creator,涵盖了从下载到安装的全过程,并提供了常见问题的解决方案。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
author-avatar
yngbzl_165
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有