U-Boot和Linux内核的CRC函数

测试的时候,发现内核驱动里用crc32_le计算出的值和u-boot里用crc32计算出的值不一样。 又用python的zlib.crc32和把内容写到文件用linuxcrc32命令计算,发现与u-bootcrc32函数计算结果一致。 对比u-boot和linux内核用的crc32table,两者是一致的,后来查看代码,发现u-boot的crc32有个与0xffffffffL进行异或的操作。 实际linux的crc32_le函数与u-boot的crc32_no_comp函数是一致的。 1uint32_t __efi_runtime crc32(uint32_t crc, const Bytef *p, uInt len) 2{ 3...

U-Boot从dtb获取内存布局并传递到内核

1. U-Boot获取布局内存 U-Boot在启动过程中,默认内存布局通常在.config中定义。 1CONFIG_SYS_SDRAM_BASE=0x240000000 2CONFIG_SYS_DDR_SIZE=0xC0000000 在DDR控制器初始化完成之后,就要确定系统中有多少可用内存,这通常是由dram_init_banksize来实现的,而不同的板级文件会实现不同的dram_init_banksize,这也就决定了不同的板级可以定义不同的获取内存布局的方法。这里介绍一种从dtb中获取内存布局的实现,这可以通过简单的调用fdtdec_setup_memory_banksize来实现。而在使能...

U-Boot杂项记录

1. get_ram_size get_ram_size只适用于CONFIG_SYS_DDR_SIZE=2^n。 1int dram_init(void) 2{ 3 gd->ram_size = get_ram_size((long *)CONFIG_SYS_SDRAM_BASE, 4 CONFIG_SYS_DDR_SIZE); 5 return 0; 6} 2. 多核启动之spintable U-Boo中需要开启ARMV8_MULTIENTRY,另外CPU_RELEASE_ADDR的值要与内核dtb的cpu-release-addr保持一致。 1#define CPU_RELEASE_ADDR 0x100000 3. FIT...

U-Boot启动分析

1. 查找入口 u-boot版本:2024.01 参考defconfig:imx8qm_mek_defconfig 通过编译生成的u-boot.lds,U-Boot的入口为_start。而程序的一开始存放的指令是由start.c生成的。 1ENTRY(_start) 1 . = 0x00000000; 2 . = ALIGN(8); 3 .text : 4 { 5 *(.__image_copy_start) 6 arch/arm/cpu/armv8/start.o (.text*) 7 } 2. 程序流程 2.1. _start 默认情况下_start会直接通过b reset跳转到reset处。 在反汇编中,1400000a就...

u-boot的stubs机制

1. U-Boot版本 1VERSION = 2021 2PATCHLEVEL = 10 3SUBLEVEL = 4EXTRAVERSION = 5NAME = 2. 涉及的文件 include/_exports.h,辅助文件,在包含_exports.h前,定义不同的EXPORT_FUNC来实现不同的功能,其内容为一系列EXPORT_FUNC修饰的函数。 include/exports.h,函数声明。 examples/standalone/stubs.c,用于建立jumptable,将U-Boot的函数指针存入jumptable中。 common/exports.c,初始化jumptable。...