导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    香橙派One(全志H3芯片)编译烧写U-boot、Linux内核zImage、dtb

    H/F/TV Series
    2
    2
    2555
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • Y
      giao LV 6 最后由 编辑

      一、编译烧写u-boot

      1.1 源码和工具下载:

      香橙派提供了u-boot源码和交叉编译链工具:
      (1)u-boot(2020.04)下载地址:https://github.com/orangepi-xunlong/u-boot-orangepi
      (2)交叉编译工具链(arm-linux-gnueabihf-)下载地址:https://github.com/orangepi-xunlong/toolchain

      1.2 编译烧写u-boot

      (1)进入到u-boot源码目录下,先清理一下工程:

      make -j8 ARCH=arm CROSS_COMPILE=/home/jing/orangepi/toolchain-master/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- distclean
      

      交叉编译工具的路径根据自己实际情况修改

      (2)编译生成.config配置文件

      make -j8 ARCH=arm CROSS_COMPILE=/home/jing/orangepi/toolchain-master/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- orangepi_one_defconfig
      

      注意:需要的defconfig配置信息在u-boot源码的configs文件夹下,我用的是香橙派One开发板,所以make的是orangepi_one_defconfig

      编译完成后如下图:

      f2bda6737073451cacbf1b4f4b36deb0.png

      (3)编译u-boot

      make -j8 ARCH=arm CROSS_COMPILE=/home/jing/orangepi/toolchain-master/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
      

      编译成功后会在u-boot目录下面生成一个.bin文件,这个文件就是我们要烧写到SD卡的u-boot二进制文件

      1c5b8a0616d643a1b17500d5e94bb46f.png

      (4)烧写u-boot

      将SD卡插入读卡器,将读卡器连接电脑,在u-boot目录下,将.bin文件烧写到SD卡中

      sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
      

      1.3 u-boot启动

      将SD卡插入到香橙派开发板,连接开发板串口,启动测试,若输出如下则启动正常

      8db895e996c547d893e16a49177f49ff.png

      可以看出u-boot会把版本号、板载硬件信息等都打印出来

      二、烧录Linux内核zImage、dtb

      2.1 Linux内核源码下载
      这里使用香橙派官方提供的linux内核源码,版本为Linux5.4.65:

      https://github.com/orangepi-xunlong/linux-orangepi
      

      2.2 Linux内核编译
      进入linux内核目录,依次输入以下命令,指定交叉编译器和处理器架构:

      make -j8 ARCH=arm CROSS_COMPILE=/home/jing/orangepi/toolchain-master/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- distclean // 清理工程
      make -j8 ARCH=arm CROSS_COMPILE=/home/jing/orangepi/toolchain-master/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- sunxi_defconfig // 生成.config配置文件
      make -j8 ARCH=arm CROSS_COMPILE=/home/jing/orangepi/toolchain-master/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- // 开始编译
      

      编译完成后,我们需要的镜像zImage,设备树文件sun8i-h3-orangepi-pc.dtb都出现了:

      • zImage在/arch/arm/boot目录下

      • sun8i-h3-orangepi-pc.dtb在/arch/arm/boot/dts目录下

      2.3 zImage和dtb加载

      zImage和dtb烧录有两种办法,一种是通过tftp远程加载,另一种是直接从SD卡加载,在加载之前,需要知道全志H3芯片从内存启动内核和设备树的地址,在u-boot输入命令printenv,查看环境变量,会看到如下两个信息:

      fdt_addr_r=0x43000000
      kernel_addr_r=0x42000000
      

      可知设备树文件是从内存的0x43000000地址启动,内核是从内存的0x42000000地址启动。

      (1)tftp远程加载zImage和dtb
      本文所有的开发都是基于Ubuntu18.04虚拟机,所以为了方便传输,直接将zImage和dtb文件拷贝到windows下,建立开发板与windows之间的tftp传输,这里借助Mobaxterm软件直接设置tftp服务,在图中红框部分填写好tftp连接到的本地目录。

      e0925fb07bbd4ba2849103fe4e04e332.png

      需要先对开发板环境变量进行以下设置:

      setenv ipaddr=192.168.1.101 // 设置开发板ip地址
      setenv gatewayip=192.168.1.1 // 设置网关
      setenv netmask=255.255.255.0 // 设置子网掩码
      setenv serverip=192.168.1.104 // 设置tftp主机的ip地址
      saveenv // 保存环境变量
      

      注意:开发板的ip地址和主机的ip地址要保存在一个网关下(连接到同一个路由器),开发板的网关和子网掩码与主机设置一致,设置完后重启一下开发板

      ping一下主机ip,试一下能不能连接到主机,出现alive就代表可以连接

      f2bda6737073451cacbf1b4f4b36deb0.png

      接着在开发板u-boot敲入以下命令行,将两个文件加载到内存:

      tftp 42000000 zImage // 将zImage加载到内存的0x42000000位置处
      tftp 43000000 sun8i-h3-orangepi-pc.dtb // 将设备树加载到内存0x43000000位置处
      

      加载成功的话,会有一个Loading的进度条和done表示完成。

      接着启动内核和设备树:

      bootz 42000000 - 43000000 // 启动内核和设备树
      

      启动成功的话,会有以下界面,另外开发板上的led灯也会从红色变为绿色:

      525fceb67752412997e4b456a961800a.png

      由于没有加载根文件系统,所以启动过程会卡在VFS:Unable to mount root f…

      (2)从SD卡加载zImage和dtb
      有的文章会对SD卡进行分区,然后将两个文件放在不同的分区中,参考文献[2]。本文这里为了方便操作,不对SD卡分区,直接将两个文件拷贝到SD卡中,然后将SD卡插到开发板上。启动u-boot,输入以下命令:

      load mmc 0:1 0x43000000 sun8i-h3-orangepi-pc.dtb
      load mmc 0:1 0x42000000 zImage
      
      • 第一个命令解释:从mmc(SD卡)的第0个和第1个分区寻找名字叫做sun8i-h3-orangepi-pc.dtb的文件,然后加载到内存的0x43000000位置上

      • 第二个命令解释:从mmc(SD卡)的第0个和第1个分区寻找名字叫做zImage的文件,然后加载到内存的0x42000000位置上
        接着加载内核和设备树:

      bootz 42000000 - 43000000
      

      启动成功的话,会有以下界面:另外开发板上的led灯也会从红色变为绿色

      525fceb67752412997e4b456a961800a (1).png

      由于没有加载根文件系统,所以启动过程会卡在VFS:Unable to mount root f…

      如果不想每次都load加载,可以设置开机环境变量,每次开机都可以自动加载:

      setenv bootcmd 'load mmc 0:1 0x43000000 sun8i-h3-orangepi-pc.dtb; load mmc 0:1 0x42000000 zImage; bootz 0x42000000 - 0x43000000'
      saveenv
      

      要想真正启动Linux系统,下一步还需要建立根文件系统,敬请期待!

      ————————————————
      版权声明:本文为CSDN博主「小景-SCUT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      原文链接:https://blog.csdn.net/weixin_39954922/article/details/130984241

      K 1 条回复 最后回复 回复 引用 分享 4
      • K
        ky1688 LV 2 @yanmingjian 最后由 编辑

        @yanmingjian H3的刷入系统文件一直重启,能解决吗?

        1 条回复 最后回复 回复 引用 分享 0
        • 1 / 1
        • First post
          Last post

        Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

        行为准则 | 用户协议 | 隐私权政策