建英文网站有用吗网站开发流程php
建英文网站有用吗,网站开发流程php,研究院网站建设方案,长春一般做一个网站需要多少钱1. 为什么需要移植U-Boot#xff1f;从零开始的认知
如果你刚拿到一块RK3399的开发板#xff0c;比如我手头这块迅为的#xff0c;第一件事可能就是想着赶紧跑个系统看看。厂家通常会提供一个完整的SDK或者镜像包#xff0c;直接烧进去就能用。那为什么我们还要折腾U-Boot移…1. 为什么需要移植U-Boot从零开始的认知如果你刚拿到一块RK3399的开发板比如我手头这块迅为的第一件事可能就是想着赶紧跑个系统看看。厂家通常会提供一个完整的SDK或者镜像包直接烧进去就能用。那为什么我们还要折腾U-Boot移植呢这就像你买了一套精装房直接能住但如果你想换个自己喜欢的瓷砖、改一下水电布局那就得动工了。移植U-Boot就是给开发板“动工”的第一步。U-Boot你可以把它理解成电脑的BIOS或者手机的开机引导程序。它的核心任务就两个初始化最基础的硬件比如内存DDR、存储EMMC然后找到并启动真正的操作系统内核比如Linux。厂家提供的U-Boot镜像是通用的能保证板子跑起来但它不一定完全契合你板子上的每一个细节。比如你的屏幕接口是LVDS还是MIPI你的以太网PHY芯片型号是什么你的按键布局是怎样的这些硬件差异都需要在U-Boot的设备树Device Tree里进行描述和配置。移植就是让这个通用的引导程序能完美识别并驱动你手上这块特定开发板的硬件。我自己刚开始玩RK3399的时候也觉得直接用厂家的镜像省事。但后来想加个功能改个启动logo或者优化一下启动速度发现不动U-Boot根本不行。而且理解U-Boot的移植过程是深入嵌入式Linux开发的必经之路。它能让你彻底搞明白板子上电后到底发生了什么从一片黑暗到屏幕点亮这中间的魔法是怎么实现的。这个过程虽然有些繁琐但踩过一遍坑之后你对整个系统的掌控力会完全不一样。2. 战前准备搭建你的开发环境工欲善其事必先利其器。在开始动手修改代码之前一个稳定、高效的编译环境是成功的一半。我强烈建议你在Ubuntu系统下进行版本18.04或20.04 LTS都比较稳定社区支持也好。直接在物理机上安装或者用VMware、VirtualBox装个虚拟机都行记得给虚拟机多分点资源至少4核CPU8GB内存50GB硬盘编译起来会快很多。2.1 安装必备的编译工具链首先打开终端我们把编译需要的软件包一次性装好。这些包包括编译器、链接器、各种库文件缺一不可。sudo apt-get update sudo apt-get install -y gcc-aarch64-linux-gnu g-aarch64-linux-gnu \ device-tree-compiler bison flex libssl-dev ncurses-dev \ git make gcc g swig python3-dev这里重点说一下gcc-aarch64-linux-gnu这是针对ARM 64位架构也就是RK3399的Cortex-A72/A53核心的交叉编译器。所谓“交叉”就是在我们x86的电脑上编译出能在ARM板子上运行的代码。装好后可以用aarch64-linux-gnu-gcc -v命令检查一下版本确保安装成功。2.2 获取U-Boot源码这是最关键的一步。就像前面说的我们一般不直接用U-Boot官方的源码www.denx.de因为那里面没有针对RK3399芯片的底层支持。我们需要的是芯片原厂Rockchip基于官方U-Boot修改适配好的版本。通常开发板厂家会提供这个源码。以我的迅为RK3399开发板为例源码可以在他们提供的资料盘里找到一般是一个叫uboot_rk3399_xxxx.tar.gz的压缩包。我们把它解压到你的工作目录。tar -xzvf uboot_rk3399_linux_v2.0.tar.gz cd uboot_rk3399_linux_v2.0解压后你会看到一个名为u-boot的文件夹这就是我们所有工作的根目录了。进去看看里面文件很多别慌我们大部分时间只关注几个关键的目录arch/arm/dts/存放设备树文件configs/存放默认配置文件include/configs/有一些头文件配置。在开始编译前我建议你先用厂家提供的现成镜像一个完整的update.img把板子烧录一遍确保硬件本身屏幕、内存、EMMC是好的。这能避免后续调试时把硬件问题误认为是软件移植的问题白白浪费很多时间。3. 第一次编译让官方镜像跑起来拿到源码先别急着改。我们的第一步是“复现”即用源码编译出一个和厂家提供的一模一样的U-Boot镜像确保编译环境、源码本身没问题。3.1 使用编译脚本RK平台的U-Boot源码里一般会带一个make.sh的脚本它封装了复杂的编译命令用起来很方便。我们先看看它有哪些选项。cd u-boot ./make.sh help你会看到一堆输出其中针对RK3399的通常就是./make.sh rk3399。这个命令会做几件事首先使用configs/rk3399_defconfig这个默认配置然后调用交叉编译工具链进行编译最后将编译出的二进制文件打包成Rockchip平台专用的uboot.img和trust.img信任固件与安全启动相关。所以直接执行./make.sh rk3399如果一切顺利编译完成后在u-boot目录下会生成uboot.img和trust.img这两个我们最终要烧录的文件。同时在u-boot根目录会生成一个.config文件这是当前编译配置的详细信息后续我们通过make menuconfig图形化界面修改的配置最终都会反映在这个文件里。3.2 烧录与验证编译成功只是第一步我们得把它烧到板子上看看效果。RK3399通常通过Rockchip提供的AndroidToolWindows或upgrade_toolLinux工具让板子进入Loader模式按住Recovery键再上电进行烧录。这里有个小坑需要注意不要一上来就只烧录这两个新编译的镜像。稳妥的做法是先烧录完整的、已知可用的系统镜像比如厂家的update.img让板子能正常启动Linux。然后再用工具单独替换其中的uboot.img和trust.img为我们刚编译出来的。这样做的好处是即使新U-Boot有问题我们还可以通过工具重新烧录而不会让板子彻底“变砖”。烧录完成后连接串口调试终端我常用MobaXterm或SecureCRT设置好串口号和波特率。这里又有一个关键点RK3399 U-Boot默认的调试串口波特率是15000001.5Mbps。很多串口工具不支持这么高的波特率你会看到乱码。解决方法有两个一是找一个支持1.5M波特率的终端软件二是在U-Boot里把波特率改低比如改成115200。怎么改呢我们需要在编译前配置。在u-boot目录下执行make menuconfig这会进入一个字符图形的配置界面。通过键盘方向键导航找到- Boot timing [*] Delay before automatically booting (3) Autoboot delay (seconds) - Serial port (115200) Default baudrate把默认波特率改成115200然后把自动启动延时设为3秒方便我们按按键中断启动。保存退出后重新执行./make.sh注意这次不用加rk3399参数了因为.config已经存在并包含了我们的修改进行编译。再次烧录后串口应该就能看到清晰的启动信息了。当你看到串口打印出U-Boot版本信息并出现Hit any key to stop autoboot的提示时恭喜你你编译的U-Boot已经成功运行起来了4. 创建属于自己开发板的配置能用官方配置跑通只是热身。现在我们来点真格的为我们的特定开发板创建独立的配置。为什么不能直接改rk3399_defconfig呢可以但不推荐。那样会污染原始配置以后想对比或者回退都很麻烦。好的实践是“复制并修改”。4.1 复制并修改设备树文件设备树.dts文件是描述硬件拓扑结构的核心。RK3399公版配置的设备树文件是rk3399-evb.dts。我们的开发板硬件通常基于某个公版设计比如迅为的板子可能参考了官方的EVB板。复制文件cd arch/arm/dts/ cp rk3399-evb.dts rk3399-itop.dts这里我以itop为例你可以换成自己板子的名字。修改文件头用文本编辑器打开rk3399-itop.dts把第一行的包含头文件改掉。// 将原来的 #include rk3399-evb.dtsi // 修改为 #include rk3399-itop.dtsi注意这里引用的.dtsi文件是更基础的设备树头文件它可能也需要复制和修改。通常我们先从rk3399-evb.dtsi复制一份为rk3399-itop.dtsi后续更细致的硬件差异比如GPIO、电源管理就在这个.dtsi文件里修改。而.dts文件主要描述板级差异比如哪个引脚接了LED哪个接了按键。让新文件参与编译编辑同目录下的Makefile文件找到dtb-$(CONFIG_ROCKCHIP_RK3399)开头的部分添加我们新创建的设备树目标。dtb-$(CONFIG_ROCKCHIP_RK3399) \ rk3399-evb.dtb \ rk3399-fpga.dtb \ rk3399-itop.dtb \ # 添加这一行 ...4.2 创建专属的配置文件defconfig接下来为我们的板子创建编译配置。复制默认配置cd ../../.. # 回到U-Boot根目录 cp configs/rk3399_defconfig configs/rk3399_itop_defconfig修改关键配置用编辑器打开configs/rk3399_itop_defconfig。最重要的修改是指定我们自己的设备树文件。CONFIG_DEFAULT_DEVICE_TREErk3399-itop还可以在这里预置一些环境变量比如默认的bootcmd启动命令、bootargs内核参数等。例如如果你的内核分区在EMMC的第6个分区可以设置CONFIG_BOOTCOMMANDmmc dev 0; ext4load mmc 0:6 0x00280000 Image; ext4load mmc 0:6 0x00a00000 rk3399-itop.dtb; booti 0x00280000 - 0x00a00000 CONFIG_BOOTARGSconsolettyS2,115200 earlyconuart8250,mmio32,0xff1a0000 root/dev/mmcblk0p7 rootwait4.3 编写一键编译脚本每次都敲一串命令太麻烦我习惯写一个build.sh脚本放在U-Boot根目录一键完成清理、配置、编译、打包。#!/bin/bash # build.sh for itop-rk3399 echo Cleaning old builds make distclean echo Applying itop-rk3399 defconfig make rk3399_itop_defconfig echo (Optional) Launch menuconfig for adjustment # 如果不需要图形化配置注释掉下一行 # make menuconfig echo Starting compilation make -j$(nproc) # -j 参数指定并行编译的线程数加快速度 echo Packaging images ./make.sh uboot ./make.sh trust echo Build Complete! echo Generated images: ls -lh uboot.img trust.img记得给脚本加上执行权限chmod x build.sh。以后每次修改代码后只需要运行./build.sh就可以了。这个脚本也体现了清晰的编译流程清理 - 配置 - 编译 - 打包。注意如果你已经通过make menuconfig调整过配置并生成了.config那么脚本中的make rk3399_itop_defconfig这一行就应该注释掉否则会覆盖你的自定义配置。5. 深入U-Boot常用命令与调试技巧U-Boot启动时在倒计时阶段按下回车键就会进入命令行交互模式。这里就像一个小型的操作系统有很多实用的命令。掌握它们对于调试和开发至关重要。5.1 信息查询命令bdinfo打印板子信息。这是我最常用的命令之一它会显示内存起始地址和大小DRAM bank、IP地址、串口波特率等。移植时首先用它确认DDR初始化是否正确内存大小是否识别对了。printenv打印所有环境变量。这是U-Boot的“配置中心”启动命令、网络参数、串口参数等都存在这里。仔细看看能帮你理解启动流程。version查看U-Boot版本和编译时间确认你烧录的是否是最新编译的镜像。5.2 环境变量操作环境变量是U-Boot的“记忆”存储在EMMC或SPI Flash的一个特定区域。setenv name value设置环境变量。例如setenv bootdelay 5将启动延时改为5秒。如果值中有空格必须用单引号括起来如setenv bootcmd mmc dev 0; fatload mmc 0 0x80080000 zImage; bootz 0x80080000。saveenv将当前内存中的环境变量保存到持久化存储中。非常重要你用setenv做的修改只是临时的重启就丢。必须执行saveenv才会永久生效。我第一次移植时就忘了保存折腾了半天为什么修改不生效。要删除一个变量就用setenv name后面不跟值。5.3 网络与TFTP下载通过网络从TFTP服务器加载内核和设备树是最高效的调试方式不用反复烧录EMMC。设置网络参数setenv ipaddr 192.168.1.100 # 开发板IP setenv serverip 192.168.1.10 # 你的电脑TFTP服务器IP setenv netmask 255.255.255.0 setenv gatewayip 192.168.1.1 saveenv测试网络ping 192.168.1.10。注意U-Boot的ping是单向的只能板子ping电脑电脑不能ping板子。使用TFTP加载文件tftp 0x00280000 zImage # 将内核镜像加载到内存0x00280000 tftp 0x00a00000 rk3399-itop.dtb # 将设备树加载到内存0x00a00000 booti 0x00280000 - 0x00a00000 # 启动内核你可以把这一串命令设到bootcmd环境变量里实现上电自动网络启动。5.4 存储设备操作mmc list列出所有MMC设备如EMMC、SD卡。mmc dev 0切换到设备0通常是EMMC。mmc dev 1切换到SD卡。fatls mmc 0:1列出EMMC第一个FAT分区中的文件。ext4ls mmc 0:6列出第六个EXT4分区的文件。fatload mmc 0:1 0x80080000 zImage从EMMC第一个分区加载文件到内存。5.5 启动命令boot执行bootcmd环境变量中的命令。bootz/bootm/booti分别用于启动zImage、uImage、Image格式的内核。现在主流是booti启动ARM64的Image。reset重启开发板。6. 实战排坑那些年我踩过的坑移植过程不可能一帆风顺分享几个我遇到过的典型问题和解决办法。坑一编译通过但烧录后串口无任何输出。可能原因1DDR初始化失败。这是最严重的情况U-Boot最早期的代码就是初始化DDR如果这里挂了后续所有代码都无法运行自然没输出。首先检查board/rockchip/evb_rk3399/sdram.c或类似文件中的DDR配置参数比如时序、大小是否与你的板子匹配。迅为这类厂家通常会在源码包里提供一个rkbin目录里面有预编译好的DDR初始化二进制固件确保它被正确打包进最终的uboot.img。可能原因2串口引脚复用或波特率错误。确认你的调试串口是哪个UART通常是UART2。检查设备树中该UART节点的status是否为okay以及pinctrl配置是否正确。波特率不对应也会是乱码或没输出确保终端软件设置和U-Boot配置一致。坑二能启动U-Boot但boot命令启动内核失败。可能原因1内核或设备树加载地址错误。booti命令需要三个参数内核镜像地址、initrd地址没有就用-代替、设备树地址。确保你加载文件的地址和这里命令使用的地址一致并且地址范围在DDR的有效范围内通过bdinfo查看。可能原因2设备树不匹配。这是最常见的原因。内核启动时会根据设备树的信息去驱动硬件。如果设备树里描述的设备比如EMMC、屏幕和实际硬件对不上内核可能会卡住。仔细核对设备树文件特别是EMMC的节点dwmmcfe320000、屏幕的节点dsi或edp等。可以尝试先用厂家提供的、能启动的镜像里的设备树文件替换你编译的看看是否能成功以此定位问题。坑三环境变量无法保存saveenv失败。可能原因存储环境变量的设备未配置或驱动失败。在make menuconfig中检查环境变量的存储位置设置。对于RK3399通常存在EMMC的某个分区。- Environment - Environment in an MMC device确保选中并且Environment offset设置正确一般不用改。如果还是失败在U-Boot命令行用mmc dev和mmc part命令看看EMMC是否能正常识别和访问。坑四网络Ping/TFTP不通。可能原因1PHY芯片驱动问题。RK3399的以太网是通过外部PHY芯片实现的如RTL8211F。你需要确认设备树中以太网节点ethernetfe300000下的phy子节点其phy-mode和reg地址是否正确。有时候PHY需要额外的复位GPIO配置这部分也常在设备树里描述。可能原因2环境变量未设置或未保存。再检查一遍ipaddr,serverip,gatewayip等变量是否正确并且用saveenv保存了。调试的精髓在于缩小范围和对比验证。遇到问题时先从最基础的硬件初始化DDR、串口查起然后到外设驱动EMMC、网络最后到启动流程。多利用printenv查看环境变量用bdinfo查看硬件状态用md内存显示命令查看加载到内存的文件头是否正确。每次只做一处修改并记录下修改前后的现象这样才能快速定位问题所在。这个过程很磨练人但每解决一个坑你对系统的理解就深一层。