翼度科技»论坛 云主机 LINUX 查看内容

Rockchip RK3399 - 移植uboot 2023.04和内核FIT uImage制作

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
----------------------------------------------------------------------------------------------------------------------------
开发板   :NanoPC-T4开发板
eMMC   :16GB
LPDDR3:4GB
显示屏   :15.6 HDMI接口显示屏
u-boot   :2023.04
linux     :5.2.8
----------------------------------------------------------------------------------------------------------------------------
在前面我们已经介绍了编译Rockchip官方提供的uboot源码,并下载到开发板中进行测试运行。这一节我们尝试下载最新的uboot版本试试,当前最新版本为2023.04。
一、uboot

1.1 下载源码

u-boot软件包下载网站:https://ftp.denx.de/pub/u-boot/
DENX相关的网站:http://www.denx.de/re/DPLG.html
u-boot git仓库:https://gitlab.denx.de/u-boot/u-boot
我们在ubuntu运行如下命令:
  1. root@zhengyang:/work/sambashare/rk3399# wget https://ftp.denx.de/pub/u-boot/u-boot-2023.04.tar.bz2
复制代码
解压:
  1. root@zhengyang:/work/sambashare/rk3399# tar -jxf u-boot-2023.04.tar.bz2
复制代码
进入到uboot文件夹里,这就是我们需要的uboot的源码了:
  1. root@zhengyang:/work/sambashare/rk3399#  cd u-boot-2023.04
  2. root@zhengyang:/work/sambashare/rk3399/u-boot-2023.04# ll
  3. 总用量 484
  4. drwxrwxr-x  25 root root  4096 Apr  4 04:38 ./
  5. drwxr-xr-x  14 root root  4096 May 21 15:22 ../
  6. drwxrwxr-x   2 root root  4096 Apr  4 04:38 api/
  7. drwxrwxr-x  14 root root  4096 Apr  4 04:38 arch/
  8. -rw-rw-r--   1 root root 21095 Apr  4 04:38 .azure-pipelines.yml
  9. drwxrwxr-x 177 root root  4096 Apr  4 04:38 board/
  10. drwxrwxr-x   2 root root  4096 Apr  4 04:38 boot/
  11. -rw-rw-r--   1 root root   814 Apr  4 04:38 .checkpatch.conf
  12. drwxrwxr-x  10 root root  4096 Apr  4 04:38 cmd/
  13. drwxrwxr-x   5 root root  4096 Apr  4 04:38 common/
  14. -rw-rw-r--   1 root root  2180 Apr  4 04:38 config.mk
  15. drwxrwxr-x   2 root root 57344 Apr  4 04:38 configs/
  16. drwxrwxr-x   2 root root  4096 Apr  4 04:38 disk/
  17. drwxrwxr-x  20 root root  4096 Apr  4 04:38 doc/
  18. drwxrwxr-x  74 root root  4096 Apr  4 04:38 drivers/
  19. drwxrwxr-x   2 root root  4096 Apr  4 04:38 dts/
  20. drwxrwxr-x   2 root root  4096 Apr  4 04:38 env/
  21. drwxrwxr-x   4 root root  4096 Apr  4 04:38 examples/
  22. drwxrwxr-x  15 root root  4096 Apr  4 04:38 fs/
  23. -rw-rw-r--   1 root root    44 Apr  4 04:38 .get_maintainer.conf
  24. -rw-rw-r--   1 root root   207 Apr  4 04:38 .gitattributes
  25. drwxrwxr-x   2 root root  4096 Apr  4 04:38 .github/
  26. -rw-rw-r--   1 root root  1115 Apr  4 04:38 .gitignore
  27. -rw-rw-r--   1 root root 14133 Apr  4 04:38 .gitlab-ci.yml
  28. drwxrwxr-x  36 root root 20480 Apr  4 04:38 include/
  29. -rw-rw-r--   1 root root   783 Apr  4 04:38 Kbuild
  30. -rw-rw-r--   1 root root 20750 Apr  4 04:38 Kconfig
  31. drwxrwxr-x  24 root root  4096 Apr  4 04:38 lib/
  32. drwxrwxr-x   2 root root  4096 Apr  4 04:38 Licenses/
  33. -rw-rw-r--   1 root root  4022 Apr  4 04:38 .mailmap
  34. -rw-rw-r--   1 root root 42030 Apr  4 04:38 MAINTAINERS
  35. -rw-rw-r--   1 root root 81547 Apr  4 04:38 Makefile
  36. drwxrwxr-x   2 root root  4096 Apr  4 04:38 net/
  37. drwxrwxr-x   5 root root  4096 Apr  4 04:38 post/
  38. -rw-rw-r--   1 root root 94985 Apr  4 04:38 README
  39. -rw-rw-r--   1 root root   491 Apr  4 04:38 .readthedocs.yml
  40. drwxrwxr-x   6 root root  4096 Apr  4 04:38 scripts/
  41. drwxrwxr-x  17 root root  4096 Apr  4 04:38 test/
  42. drwxrwxr-x  15 root root  4096 Apr  4 04:38 tools/
复制代码
1.2 配置uboot

uboot的编译分为两步:配置、编译。单板的默认配置在configs目录下,这里我们直接选择configs/evb-rk3399_defconfig,这是Rockchip评估板的配置:
  1. CONFIG_ARM=y
  2. CONFIG_SKIP_LOWLEVEL_INIT=y
  3. CONFIG_COUNTER_FREQUENCY=24000000
  4. CONFIG_ARCH_ROCKCHIP=y
  5. CONFIG_TEXT_BASE=0x00200000
  6. CONFIG_NR_DRAM_BANKS=1
  7. CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
  8. CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x300000
  9. CONFIG_ENV_OFFSET=0x3F8000
  10. CONFIG_DEFAULT_DEVICE_TREE="rk3399-evb"
  11. CONFIG_DM_RESET=y
  12. CONFIG_ROCKCHIP_RK3399=y
  13. CONFIG_TARGET_EVB_RK3399=y
  14. CONFIG_SPL_STACK=0x400000
  15. CONFIG_DEBUG_UART_BASE=0xFF1A0000
  16. CONFIG_DEBUG_UART_CLOCK=24000000
  17. CONFIG_SYS_LOAD_ADDR=0x800800
  18. CONFIG_DEBUG_UART=y
  19. CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399-evb.dtb"
  20. CONFIG_DISPLAY_BOARDINFO_LATE=y
  21. CONFIG_SPL_MAX_SIZE=0x2e000
  22. CONFIG_SPL_PAD_TO=0x7f8000
  23. CONFIG_SPL_HAS_BSS_LINKER_SECTION=y
  24. CONFIG_SPL_BSS_START_ADDR=0x400000
  25. CONFIG_SPL_BSS_MAX_SIZE=0x2000
  26. # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
  27. # CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
  28. CONFIG_SPL_STACK_R=y
  29. CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x10000
  30. CONFIG_TPL=y
  31. CONFIG_CMD_BOOTZ=y
  32. CONFIG_CMD_GPT=y
  33. CONFIG_CMD_MMC=y
  34. CONFIG_CMD_USB=y
  35. # CONFIG_CMD_SETEXPR is not set
  36. CONFIG_CMD_TIME=y
  37. CONFIG_SPL_OF_CONTROL=y
  38. CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
  39. CONFIG_ENV_IS_IN_MMC=y
  40. CONFIG_SYS_RELOC_GD_ENV_ADDR=y
  41. CONFIG_NET_RANDOM_ETHADDR=y
  42. CONFIG_ROCKCHIP_GPIO=y
  43. CONFIG_SYS_I2C_ROCKCHIP=y
  44. CONFIG_MISC=y
  45. CONFIG_MMC_HS400_SUPPORT=y
  46. CONFIG_MMC_DW=y
  47. CONFIG_MMC_DW_ROCKCHIP=y
  48. CONFIG_MMC_SDHCI=y
  49. CONFIG_MMC_SDHCI_SDMA=y
  50. CONFIG_MMC_SDHCI_ROCKCHIP=y
  51. CONFIG_SF_DEFAULT_SPEED=20000000
  52. CONFIG_ETH_DESIGNWARE=y
  53. CONFIG_GMAC_ROCKCHIP=y
  54. CONFIG_PHY_ROCKCHIP_INNO_USB2=y
  55. CONFIG_PHY_ROCKCHIP_TYPEC=y
  56. CONFIG_PMIC_RK8XX=y
  57. CONFIG_REGULATOR_PWM=y
  58. CONFIG_REGULATOR_RK8XX=y
  59. CONFIG_PWM_ROCKCHIP=y
  60. CONFIG_DM_RNG=y
  61. CONFIG_RNG_ROCKCHIP=y
  62. CONFIG_BAUDRATE=1500000
  63. CONFIG_DEBUG_UART_SHIFT=2
  64. CONFIG_SYS_NS16550_MEM32=y
  65. CONFIG_SYSRESET=y
  66. CONFIG_USB=y
  67. CONFIG_USB_XHCI_HCD=y
  68. CONFIG_USB_XHCI_DWC3=y
  69. CONFIG_USB_EHCI_HCD=y
  70. CONFIG_USB_EHCI_GENERIC=y
  71. CONFIG_USB_DWC3=y
  72. CONFIG_USB_DWC3_GENERIC=y
  73. CONFIG_USB_HOST_ETHER=y
  74. CONFIG_USB_ETHER_ASIX=y
  75. CONFIG_USB_ETHER_ASIX88179=y
  76. CONFIG_USB_ETHER_MCS7830=y
  77. CONFIG_USB_ETHER_RTL8152=y
  78. CONFIG_USB_ETHER_SMSC95XX=y
  79. CONFIG_VIDEO=y
  80. # CONFIG_VIDEO_BPP8 is not set
  81. CONFIG_DISPLAY=y
  82. CONFIG_VIDEO_ROCKCHIP=y
  83. CONFIG_VIDEO_ROCKCHIP_MAX_YRES=1200
  84. CONFIG_DISPLAY_ROCKCHIP_MIPI=y
  85. CONFIG_SPL_TINY_MEMSET=y
  86. CONFIG_ERRNO_STR=y
复制代码
View Code因此执行如下命令,生成.config文件:
  1. root@zhengyang:/work/sambashare/rk3399/u-boot-2023.04# make evb-rk3399_defconfig V=1
复制代码
接着我们需要执行make menuconfig做一些配置。
1.2.1 配置串口波特率

uboot中默认的调试串口波特率是1500000,有很多的调试终端不支持1.5M的波特率,我们可以把波特率重新配置下;
  1. Device Drivers  --->
  2.       Serial --->     
  3.            (115200) Default baudrate  
复制代码
注意:波特率数值如果无法删除,按CTRL+回车键尝试。如果配置为1500000,后面测试时串口输出内容一部分正常,偶尔出现乱码,考虑是串口波特率太高不稳定造成的,降低波特率到115200尝试。
这里我更改为了115200,之前烧录Rockchip官方uboot时设置为1500000一点问题都没有,但是uboot官方代码设置为1500000竟然出现乱码,看样uboot官方对RK3399支持并不是很好。
1.2.2 配置eMMC

为什么要去配置eMMC呢?这个是因为我使用默认配置,编译后的uboot下载到开发板出现了无法对eMMC进行读写的问题,并且输出了如下错误:
  1. sdhci_transfer_data: Error detected in status(0x208000)
复制代码
然后我去比对了当前版本uboot和Rockchip官方(Rockchip RK3399 - TPL/SPL方式加载uboot)提供的uboot单板配置configs/evb-rk3399_defconfig的差异,发现当前版本默认开启了以下配置:
  1. CONFIG_MMC_HS400_SUPPORT=y   # 多出了这个
  2. CONFIG_MMC_DW=y
  3. CONFIG_MMC_DW_ROCKCHIP=y
  4. CONFIG_MMC_SDHCI=y
  5. CONFIG_MMC_SDHCI_SDMA=y  # 多出了这个
复制代码
那CONFIG_MMC_HS400_SUPPOR、CONFIG_MMC_SDHCI_SDMA是什么呢? 
CONFIG_MMC_HS400_SUPPORT 是一个配置选项,用于支持嵌入式设备中的高速 MMC(Multimedia Card)/SD(Secure Digital)卡,默认情况下未启用。
启用这个选项可以让MMC/SD卡在HS400模式下运行,从而提高读写速度,但是需要确保硬件上支持 HS400 模式,并且芯片厂商提供了对应的驱动程序。如果硬件不支持或驱动程序不可用,则启用此选项将会导致系统无法正常启动。
既然我们已经明白了该配置项的作用,那我们就要看一下我们的eMMC芯片是否支持HS400模式,这里用的开发板板载的eMMC型号为:KLMAG2WEMB-B031,找到芯片的datasheet有关HS400 mode的信息,具体定位到EXT_CSD第196个字节DEVICE_TYPE,其值为0x57;可以看到eMMC工作在HS400模式时,电压要求为1.8V。

配置项CONFIG_MMC_SDHCI_SDMA用于启用SD/SDIO/MMC 主机控制器使用 DMA 方式进行数据传输。
这里我们暂且将CONFIG_MMC_HS400_SUPPORT,CONFIG_MMC_SDHCI_SDMA配置关掉:
  1. Device Drivers  --->
  2.       MMC Host controller Support  --->
  3.             [ ] MMC debugging
  4.             [ ] enable HS400 support  
  5.             [ ] Support IO voltage configuration
  6.             [ ] Support SDHCI SDMA     
复制代码
如果想查看eMMC读写命令信息,可以打开MMC debuging。
1.2.3 配置FIT
  1. Boot options  --->   
  2.      Boot images  --->
  3.          [*] Use a script to generate the .its script                                                
  4.         (arch/arm/mach-rockchip/make_fit_atf.py) .its file generator script for U-Boot FIT image
复制代码
我们之前介绍过在生成u-boot.itb文件时,需要执行如下命令:
  1. tools/mkimage -f u-boot.its u-boot.itb
复制代码
mkimage将its文件以及对应的image data file,打包成一个itb文件,也就是uboot可以识别的image file(FIT-uImage)。

因为mkimage是根据its文件中的描述来打包镜像生成itb文件(FIT-uImage),所以首先需要制作一个its文件,在its文件中描述需要被打包的镜像,主要是bl31.bin,dtb文件,u-boot-nodtb.bin。
这里我们需要使用到arch/arm/mach-rockchip/make_fit_atf.py文件,这个是从Rockchip官网uboot下拷贝过来的,内容如下,这是一个python脚本,主要就是生成一个u-boot.its文件:
[code]#!/usr/bin/env python2"""A script to generate FIT image source for rockchip boardswith ARM Trusted Firmwareand multiple device trees (given on the command line)usage: $0  [ [

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具