当前位置: 首页 > news >正文

SSD202D-UBOOT-FDT-获取DTB

因为一些需求,我们决定给uboot添加一个功能,在boot阶段识别获取出dtb,然后获取dts参数

DTS引脚是这样设置的

/*
* infinity2m-ssc011a-s01a-padmux-display.dtsi- Sigmastar
*
* Copyright (c) [2019~2020] SigmaStar Technology.
*
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License version 2 for more details.
*
*/#include <../../../../drivers/sstar/include/infinity2m/padmux.h>
#include <../../../../drivers/sstar/include/mdrv_puse.h>/ {soc {padmux {compatible = "sstar-padmux";schematic =//<PAD_GPIO0  >,<PAD_GPIO1          PINMUX_FOR_GPIO_MODE        MDRV_PUSE_I2C1_DEV_RESET >,<PAD_GPIO2          PINMUX_FOR_I2C1_MODE_1      MDRV_PUSE_I2C1_SCL >,<PAD_GPIO3          PINMUX_FOR_I2C1_MODE_1      MDRV_PUSE_I2C1_SDA >,<PAD_GPIO4 			PINMUX_FOR_PWM0_MODE_3 		MDRV_PUSE_PWM0 >,<PAD_GPIO5 			PINMUX_FOR_PWM1_MODE_4 		MDRV_PUSE_PWM1 >,<PAD_GPIO6          PINMUX_FOR_GPIO_MODE        MDRV_PUSE_EJ_TDO >,<PAD_GPIO7          PINMUX_FOR_GPIO_MODE        MDRV_PUSE_EJ_TDI >,<PAD_GPIO8          PINMUX_FOR_UART2_MODE_2     MDRV_PUSE_UART2_RX>,<PAD_GPIO9          PINMUX_FOR_UART2_MODE_2     MDRV_PUSE_UART2_TX>,<PAD_GPIO11         PINMUX_FOR_GPIO_MODE        MDRV_PUSE_I2CSW_SCL>,<PAD_GPIO13         PINMUX_FOR_GPIO_MODE        MDRV_PUSE_I2C1_DEV_IRQ >,<PAD_FUART_CTS       PINMUX_FOR_GPIO_MODE       MDRV_PUSE_CPUFREQ_VID0>,<PAD_FUART_RTS       PINMUX_FOR_GPIO_MODE       MDRV_PUSE_CPUFREQ_VID1>,<PAD_FUART_RX       PINMUX_FOR_FUART_MODE_2     MDRV_PUSE_FUART_RX >,<PAD_FUART_TX       PINMUX_FOR_FUART_MODE_2     MDRV_PUSE_FUART_TX >,<PAD_UART1_RX       PINMUX_FOR_UART1_MODE_1     MDRV_PUSE_UART1_RX >,<PAD_UART1_TX       PINMUX_FOR_UART1_MODE_1     MDRV_PUSE_UART1_TX >,<PAD_GPIO0             PINMUX_FOR_GPIO_MODE      MDRV_PUSE_SDIO0_PWR >,<PAD_PM_LED0            PINMUX_FOR_PM_LED_MODE_1      MDRV_PUSE_EMAC0_LED>,<PAD_PM_LED1            PINMUX_FOR_PM_LED_MODE_1      MDRV_PUSE_EMAC0_LED>,<PAD_SAR_GPIO0          PINMUX_FOR_SAR_MODE     MDRV_PUSE_SAR_GPIO0 >, <PAD_HSYNC_OUT          PINMUX_FOR_IDAC_MODE        MDRV_PUSE_IDAC_HSYNC>,<PAD_VSYNC_OUT          PINMUX_FOR_IDAC_MODE        MDRV_PUSE_IDAC_VSYNC>;status = "ok"; // ok or disable//status = "disable";};};};
/ {soc {padmux {compatible = "sstar-padmux";schematic =<1 0x00 0x00060102 >,<2 0x10 0x00060100 >,<3 0x10 0x00060101 >,<4 0x34 0x00080000 >,<5 0x3a 0x00080100 >,<6 0x00 0x00050002 >,<7 0x00 0x00050003 >,<8 0x2d 0x00070020>,<9 0x2d 0x00070021>,<11 0x00 0x00061000>,<13 0x00 0x00060103 >,<17 0x00 0x00030000>,<18 0x00 0x00030001>,<15 0x1e 0x00070030 >,<16 0x1e 0x00070031 >,<49 0x28 0x00070010 >,<50 0x28 0x00070011 >,<0 0x00 0x00020000 >,<69 0x77 0x00010000>,<70 0x77 0x00010000>,<71 0x7c 0x000D0000 >,<79 0x7e 0x000E0000 >,<80 0x7e 0x000E0000 >,<81 0x7e 0x000E0100 >,<82 0x7e 0x000E0100 >,<85 0x65 0x000B0100>,<86 0x65 0x000B0101>;status = "ok";};};};

上手就开始调,调用node = fdt_path_offset(bootm_fdt, "/soc/padmux");

然后发现事情并不简单,老是死在FDT_CHECK_HEADER(fdt);这个函数

#define FDT_CHECK_HEADER(fdt) \{ \int __err; \if ((__err = fdt_check_header(fdt)) != 0) \return __err; \}///
int fdt_check_header(const void *fdt)
{if (fdt_magic(fdt) == FDT_MAGIC) {/* Complete tree */if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)return -FDT_ERR_BADVERSION;if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION)return -FDT_ERR_BADVERSION;} else if (fdt_magic(fdt) == FDT_SW_MAGIC) {/* Unfinished sequential-write blob */if (fdt_size_dt_struct(fdt) == 0)return -FDT_ERR_BADSTATE;} else {return -FDT_ERR_BADMAGIC;}return 0;
}
//
#define fdt_get_header(fdt, field) \(fdt32_to_cpu(((const struct fdt_header *)(fdt))->field))
#define fdt_magic(fdt) 			(fdt_get_header(fdt, magic))
#define fdt_totalsize(fdt)		(fdt_get_header(fdt, totalsize))
#define fdt_off_dt_struct(fdt)		(fdt_get_header(fdt, off_dt_struct))
#define fdt_off_dt_strings(fdt)		(fdt_get_header(fdt, off_dt_strings))
#define fdt_off_mem_rsvmap(fdt)		(fdt_get_header(fdt, off_mem_rsvmap))
#define fdt_version(fdt)		(fdt_get_header(fdt, version))
#define fdt_last_comp_version(fdt) 	(fdt_get_header(fdt, last_comp_version))
#define fdt_boot_cpuid_phys(fdt) 	(fdt_get_header(fdt, boot_cpuid_phys))
#define fdt_size_dt_strings(fdt) 	(fdt_get_header(fdt, size_dt_strings))
#define fdt_size_dt_struct(fdt)		(fdt_get_header(fdt, size_dt_struct))

这里就是检查dtb的头部和头部架构体的资料

#define OF_DT_HEADER            0xd00dfeed  

U-Boot> fdt header
magic: 0xd00dfeed
///读取到的头部///magic:                  0xd00dfeed
totalsize:              0x91aa (37290)
off_dt_struct:          0x38
off_dt_strings:         0x8cb0
off_mem_rsvmap:         0x28
version:                17
last_comp_version:      16
boot_cpuid_phys:        0x0
size_dt_strings:        0x4fa
size_dt_struct:         0x8c78
number mem_rsv:         0x0//头部结构体/struct fdt_header {uint32_t magic;			 /* magic word FDT_MAGIC */uint32_t totalsize;		 /* total size of DT block */uint32_t off_dt_struct;		 /* offset to structure */uint32_t off_dt_strings;	 /* offset to strings */uint32_t off_mem_rsvmap;	 /* offset to memory reserve map */uint32_t version;		 /* format version */uint32_t last_comp_version;	 /* last compatible version *//* version 2 fields below */uint32_t boot_cpuid_phys;	 /* Which physical CPU id we'rebooting on *//* version 3 fields below */uint32_t size_dt_strings;	 /* size of the strings block *//* version 17 fields below */uint32_t size_dt_struct;	 /* size of the structure block */
};

所以头部不正确,就一直报错,然后就开始查询原因,原来是没有读到dtb,而且要使用boot的FDT功能

打开fdt

--- a/boot/common/Kconfig
+++ b/boot/common/Kconfig
@@ -365,4 +365,23 @@ config XZconfig MZbool "MZ"config SILENT_CONSOLE
-       bool "SILENT_CONSOLE"
\ No newline at end of file
+       bool "SILENT_CONSOLE"
+
+config OF_LIBFDT
+       bool "ftd"
+       default y
+       help
+         Boot an application image from the ftd.
+
+config FIT
+       bool "FIT"
+       default y
+       help
+         Boot an application image from the ftd.
+
+config OF_CONTROL_1
+       bool "OF_CONTROL"
+       default y
+       help
+         Boot an application image from the OF_CONTROL.
+--- a/boot/lib/Makefile
+++ b/boot/lib/Makefile
@@ -23,8 +23,8 @@ obj-y += crc7.oobj-y += crc8.oobj-y += crc16.oobj-$(CONFIG_FIT) += fdtdec_common.o
-obj-$(CONFIG_OF_CONTROL) += fdtdec_common.o
-obj-$(CONFIG_OF_CONTROL) += fdtdec.o
+obj-$(CONFIG_OF_CONTROL_1) += fdtdec_common.o
+obj-$(CONFIG_OF_CONTROL_1) += fdtdec.oobj-$(CONFIG_TEST_FDTDEC) += fdtdec_test.oobj-$(CONFIG_GZIP) += gunzip.oobj-$(CONFIG_GZIP_COMPRESSED) += gzip.o

打开之后编译FDT模块了,然后开机进入boot阶段使用help可以看到fdt功能

SSD202D # help
?       - alias for 'help'fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls   - list files in a directory (default /)
fatread - FAT fatread with FSTART
fatsize - determine a file's size
fdt     - flattened device tree utility commands
get_adc - usage:get_adc channel_num , channel_num:0~3
/
SSD202D # fdt header
magic:                  0xd00dfeed
totalsize:              0x91aa (37290)
off_dt_struct:          0x38
off_dt_strings:         0x8cb0
off_mem_rsvmap:         0x28
version:                17
last_comp_version:      16
boot_cpuid_phys:        0x0
size_dt_strings:        0x4fa
size_dt_struct:         0x8c78
number mem_rsv:         0x0

这个时候就是boot的fdt功能完好了

tftp 0x32000000 infinity2m.dtb
fdt addr 32000000
tftp 0x32000000 Image
fdt addr 324a7d20
tftp 0x32000000 uImage
fdt addr 324a7d60//
SSD202D # tftp 0x32000000 infinity2m-spinand-ssc011a-s01a-display.dtb
Using sstar_emac device
TFTP from server 192.168.1.143; our IP address is 192.168.1.160
Filename 'infinity2m.dtb'.
Load address: 0x32000000
Loading: ###449.2 KiB/s
done
Bytes transferred = 37290 (91aa hex)
SSD202D # md 32000000
32000000: edfe0dd0 aa910000 38000000 b08c0000    ...........8....
32000010: 28000000 11000000 10000000 00000000    ...(............
32000020: fa040000 788c0000 00000000 00000000    .......x........
32000030: 00000000 00000000 01000000 00000000    ................
32000040: 03000000 04000000 00000000 01000000    ................
32000050: 03000000 04000000 0f000000 01000000    ................
32000060: 03000000 1a000000 1b000000 49464e49    ............INFI
32000070: 5954494e 53204d32 31304353 532d4131    NITY2M SSC011A-S
32000080: 2d413130 00000053 03000000 11000000    01A-S...........
32000090: 21000000 61747373 6e692c72 696e6966    ...!sstar,infini
320000a0: 6d327974 00000000 01000000 736f6863    ty2m........chos
320000b0: 00006e65 03000000 88000000 2c000000    en.............,
320000c0: 2e696275 3d64746d 30322c39 72203834    ubi.mtd=9,2048 r
320000d0: 3d746f6f 3a696275 54535953 72204d45    oot=ubi:SYSTEM r
320000e0: 6f722077 7366746f 65707974 6962753d    w rootfstype=ubi
320000f0: 69207366 3d74696e 6e696c2f 63727875    fs init=/linuxrcSSD202D # tftp 0x32000000 Image
Using sstar_emac device
TFTP from server 192.168.1.143; our IP address is 192.168.1.160
Filename 'Image'.
Load address: 0x32000000
Loading: ###########################################################################################################################################################################################################################################################################################################################################################1.6 MiB/s
done
Bytes transferred = 5091328 (4db000 hex)
SSD202D # md 324a7d20 40
324a7d20: edfe0dd0 aa910000 38000000 b08c0000    ...........8....
324a7d30: 28000000 11000000 10000000 00000000    ...(............
324a7d40: fa040000 788c0000 00000000 00000000    .......x........
324a7d50: 00000000 00000000 01000000 00000000    ................
324a7d60: 03000000 04000000 00000000 01000000    ................
324a7d70: 03000000 04000000 0f000000 01000000    ................
324a7d80: 03000000 1a000000 1b000000 49464e49    ............INFI
324a7d90: 5954494e 53204d32 31304353 532d4131    NITY2M SSC011A-S
324a7da0: 2d413130 00000053 03000000 11000000    01A-S...........
324a7db0: 21000000 61747373 6e692c72 696e6966    ...!sstar,infini
324a7dc0: 6d327974 00000000 01000000 736f6863    ty2m........chos
324a7dd0: 00006e65 03000000 88000000 2c000000    en.............,
324a7de0: 2e696275 3d64746d 30322c39 72203834    ubi.mtd=9,2048 r
324a7df0: 3d746f6f 3a696275 54535953 72204d45    oot=ubi:SYSTEM r
324a7e00: 6f722077 7366746f 65707974 6962753d    w rootfstype=ubi
324a7e10: 69207366 3d74696e 6e696c2f 63727875    fs init=/linuxrc
SSD202D # //
SSD202D # tftp 0x32000000 uImage
Using sstar_emac device
TFTP from server 192.168.1.143; our IP address is 192.168.1.160
Filename 'uImage'.
Load address: 0x32000000
Loading: ###########################################################################################################################################################################################################################################################################################################################################################1.6 MiB/s
done
Bytes transferred = 5091392 (4db040 hex)
SSD202D # md 324a7d60 40
324a7d60: edfe0dd0 aa910000 38000000 b08c0000    ...........8....
324a7d70: 28000000 11000000 10000000 00000000    ...(............
324a7d80: fa040000 788c0000 00000000 00000000    .......x........
324a7d90: 00000000 00000000 01000000 00000000    ................
324a7da0: 03000000 04000000 00000000 01000000    ................
324a7db0: 03000000 04000000 0f000000 01000000    ................
324a7dc0: 03000000 1a000000 1b000000 49464e49    ............INFI
324a7dd0: 5954494e 53204d32 31304353 532d4131    NITY2M SSC011A-S
324a7de0: 2d413130 00000053 03000000 11000000    01A-S...........
324a7df0: 21000000 61747373 6e692c72 696e6966    ...!sstar,infini
324a7e00: 6d327974 00000000 01000000 736f6863    ty2m........chos
324a7e10: 00006e65 03000000 88000000 2c000000    en.............,
324a7e20: 2e696275 3d64746d 30322c39 72203834    ubi.mtd=9,2048 r
324a7e30: 3d746f6f 3a696275 54535953 72204d45    oot=ubi:SYSTEM r
324a7e40: 6f722077 7366746f 65707974 6962753d    w rootfstype=ubi
324a7e50: 69207366 3d74696e 6e696c2f 63727875    fs init=/linuxrc
SSD202D # md 32000000 40
32000000: 56190527 492d0fec bb35be64 00b04d00    '..V..-Id.5..M..
32000010: 00800020 00800020 37d8df88 00020205     ... ......7....
32000020: 3458564d 32492323 3467234d 64313835    MVX4##I2M#g4581d
32000030: 36653437 4c5f4c4b 39303458 425b2323    74e6KL_LX409##[B
32000040: e28f9001 e12fff19 fa5af00c 8900f3ef    ....../...Z.....
32000050: 091af089 0f1ff019 091ff029 09d3f049    ........)...I...
32000060: 0920f049 f449d109 f20f7980 f3990e13    I. ...I..y......
32000070: f38e8f00 f3de8e30 f3898f00 ee108100    ....0...........
32000080: f0019f10 ea5ffa1e bf080a05 ba36f001    ......_.......6.
32000090: e893a30d eba30110 44a00404 f8cef000    ...........D....
320000a0: f868f000 f8a6f000 f812f000 d014f8df    ..h.............
320000b0: 0e0bf20f f8da46a0 44d4c010 f00146e7    .....F.....D.F..
320000c0: 0000b987 c04792e1 c0008088 c0000000    ......G.........
320000d0: 4400f508 4480f5a4 f04f4620 f5000300    ...D...D FO.....
320000e0: f8404680 f8403b04 f8403b04 f8403b04    .F@..;@..;@..;@.
320000f0: ea903b04 d1f40f06 7008f8da e890a01a    .;.........p....

尝试直接下载dtb和Image和Uimage,对应的地址可以读取到dtb

//ssd202d\kernel\arch\arm\boot\Makefileifeq ($(CONFIG_SS_BUILTIN_DTB), y)#update builtin DTB@test "${SS_DTB_NAME}" = "" || \if [ -e ${SS_DTB_NAME} ]; then \echo "  IMAGE   $(obj)/Image"; \echo "  BNDTB ${SS_DTB_NAME}"; \python scripts/ms_builtin_dtb_update.py $(obj)/Image ${SS_DTB_NAME}; \echo; \fi;#update Image-fpga DTB@if [ -e "arch/arm/boot/dts/$(CHIP_NAME)-fpga.dtb" ]; then \echo "  IMAGE   $(obj)/Image-fpga"; \cp -f $(obj)/Image $(obj)/Image-fpga; \echo "  BNDTB   $(CHIP_NAME)-fpga.dtb"; \python scripts/ms_builtin_dtb_update.py $(obj)/Image-fpga "arch/arm/boot/dts/$(CHIP_NAME)-fpga.dtb"; \echo; \fi;
endif///
kernel\scripts\ms_builtin_dtb_update.py#!/usr/bin/pythonimport re, fnmatch, os, sys, mmap, structif __name__ == '__main__':name='#MS_DTB#'dtb_file=open(sys.argv[2])dtb_file.seek(0,os.SEEK_END)size=dtb_file.tell()dtb_file.seek(0,os.SEEK_SET)dtb=dtb_file.read()dtb_file.close()if sys.getsizeof(dtb) > (64*1024):print ('DTB size 0x%08X too big to fit in 64K limit!!' % dtb.size())sys.exit() fmap=mmap.mmap(os.open(sys.argv[1],os.O_RDWR),0)offset=fmap.find(name)    if offset >=0:print ('offset:0x%08X' % offset)print ('  size:0x%08X' % size )fmap.seek(offset + 8, os.SEEK_SET)fmap.write(struct.pack('<I', size))fmap.seek(offset + 16, os.SEEK_SET)fmap.write(dtb)fmap.close()

可以看到edfe0dd0 的头部,image里面有dtb的内容,uimage是在image前面加了一个头部

(这个头部可以百度去看uimage内容不细说)

然后这边使用了uimage.xz包,就是还要有一个代码的解压才可以获取dtb,太难了

解压函数在boot里面

int bootm_decomp_image(int comp, ulong load, ulong image_start, int type,void *load_buf, void *image_buf, ulong image_len,uint unc_len, ulong *load_end)
{const char *type_name = genimg_get_type_name(type);
//	__attribute__((unused)) uint unc_len = CONFIG_SYS_BOOTM_LEN;printf("longmin bootm_decomp_image 444443 comp=%d; load=0x%lx;image_start=0x%lx;type=%d;image_len=0x%lx;unc_len=0x%lx;load_end=0x%lx;\n",comp,load,image_start,type,image_len,unc_len,load_end);*load_end = load;switch (comp) {case IH_COMP_XIP:case IH_COMP_NONE:if (load == image_start) {printf("   XIP %s ... ", type_name);}else if(IH_COMP_XIP==comp){printf("   Force XIP %s ... ", type_name);image_start=load;}else {printf("   Loading %s ... ", type_name);memmove_wd(load_buf, image_buf, image_len, CHUNKSZ);}*load_end = load + image_len;break;
#ifdef CONFIG_GZIPcase IH_COMP_GZIP:printf("   Uncompressing %s ... \n", type_name);if (gunzip(load_buf, unc_len, image_buf, &image_len) != 0) {puts("   GUNZIP: uncompress, out-of-mem or overwrite error - must RESET board to recover\n");return BOOTM_ERR_RESET;}*load_end = load + image_len;break;
#endif /* CONFIG_GZIP */
#ifdef CONFIG_BZIP2case IH_COMP_BZIP2:printf("   Uncompressing %s ... \n", type_name);/** If we've got less than 4 MB of malloc() space,* use slower decompression algorithm which requires* at most 2300 KB of memory.*/int i = BZ2_bzBuffToBuffDecompress(load_buf, &unc_len,image_buf, image_len,CONFIG_SYS_MALLOC_LEN < (4096 * 1024), 0);if (i != BZ_OK) {printf("   BUNZIP2: uncompress or overwrite error %d - must RESET board to recover\n",i);return BOOTM_ERR_RESET;}*load_end = load + unc_len;break;
#endif /* CONFIG_BZIP2 */
#if defined CONFIG_LZMA || defined CONFIG_XZcase IH_COMP_LZMA: {#ifdef CONFIG_XZstruct xz_buf b;struct xz_dec *s;enum xz_ret ret;printf("   Uncompressing %s ... \n", type_name);xz_crc32_init();/** Support up to 64 MiB dictionary. The actually needed memory* is allocated once the headers have been parsed.*/s = xz_dec_init(XZ_SINGLE, 16*1024);if(s==NULL){printf("  xz_dec_init ERROR!!");}b.in = image_buf/*hardcore here*/;b.in_pos = 0;b.in_size = image_len;b.out = load_buf;b.out_pos = 0;b.out_size = unc_len;ret = xz_dec_run(s, &b);//        if(ret != XZ_OK || ret != XZ_STREAM_END)
//            printf("\nXZ: uncompress erro %d\n", ret);printf("   XZ: uncompressed size=0x%x, ret=%d\n",b.out_pos, ret);xz_dec_end(s);break;#elseSizeT lzma_len = unc_len;int ret;printf("   Uncompressing %s ... \n", type_name);ret = lzmaBuffToBuffDecompress(load_buf, &lzma_len,image_buf, image_len);unc_len = lzma_len;if (ret != SZ_OK) {printf("   LZMA: uncompress or overwrite error %d - must RESET board to recover\n",ret);bootstage_error(BOOTSTAGE_ID_DECOMP_IMAGE);return BOOTM_ERR_RESET;}*load_end = load + unc_len;break;#endif}
#endif /* CONFIG_LZMA */
#ifdef CONFIG_LZOcase IH_COMP_LZO: {size_t size = unc_len;int ret;printf("   Uncompressing %s ... \n", type_name);ret = lzop_decompress(image_buf, image_len, load_buf, &size);if (ret != LZO_E_OK) {printf("   LZO: uncompress or overwrite error %d - must RESET board to recover\n",ret);return BOOTM_ERR_RESET;}*load_end = load + size;break;}
#endif /* CONFIG_LZO */
#ifdef CONFIG_MZcase IH_COMP_MZ:{extern size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags);int ret=-1;printf("   Uncompressing %s ... \n", type_name);
//		printf("  0x%08X, 0x%08X, 0x%08X, 0x%08X\n",load_buf, unc_len, image_buf, image_len);if ((ret=tinfl_decompress_mem_to_mem(load_buf, unc_len, image_buf, image_len, 0)) <0) {puts("   MZ: uncompress failed - must RESET board to recover\n");return BOOTM_ERR_RESET;}else{printf("   MZ: uncompressed size=0x%x\n",ret);}*load_end = load + image_len;break;}
#endif /* CONFIG_MZ */default:printf("   Unimplemented compression type %d\n", comp);return BOOTM_ERR_UNIMPLEMENTED;}puts("OK\n");return 0;
}

然后由于涉及bootm又是一大知识点

要了解bootm后,发现

要读取uiamge.xz要先运行环境变量

nand read.e 0x22000000 RECOVERY 0x300000

先把recovery分区读取到0x22000000上


SSD202D # md 22000000                    
30000000: 00000000 ffffffff 00000000 ffffffff    ................
30000010: 08000001 f7fffffe 08000001 f7fffffe    ................
30000020: 10000002 effffffd 10000002 effffffd    ................
30000030: 18000003 e7fffffc 18000003 e7fffffc    ................
30000040: 20000004 dffffffb 20000004 dffffffb    ... ....... ....
30000050: 28000005 d7fffffa 28000005 d7fffffa    ...(.......(....
30000060: 30000006 cffffff9 30000006 cffffff9    ...0.......0....
30000070: 38000007 c7fffff8 38000007 c7fffff8    ...8.......8....
30000080: 40000008 bffffff7 40000008 bffffff7    ...@.......@....
30000090: 48000009 b7fffff6 48000009 b7fffff6    ...H.......H....
300000a0: 5000000a affffff5 5000000a affffff5    ...P.......P....
300000b0: 5800000b a7fffff4 5800000b a7fffff4    ...X.......X....
300000c0: 6000000c 9ffffff3 6000000c 9ffffff3    ...`.......`....
300000d0: 6800000d 97fffff2 6800000d 97fffff2    ...h.......h....
300000e0: 7000000e 8ffffff1 7000000e 8ffffff1    ...p.......p....
300000f0: 7800000f 87fffff0 7800000f 87fffff0    ...x.......x....SSD202D # nand read.e 0x22000000 RECOVERY 0x300000NAND read: device 0 offset 0x840000, size 0x300000
Time:612945 us, speed:5132 KB/s3145728 bytes read: OKSSD202D # md 22000000                    
22000000: 56190527 936a491c 6a2aae64 ac472500    '..V.Ij.d.*j.%G.
22000010: 00800020 00800020 20d7ceca 03020205     ... ...... ....
22000020: 3458564d 32492323 3467234d 64313835    MVX4##I2M#g4581d
22000030: 36653437 4c5f4c4b 39303458 425b2323    74e6KL_LX409##[B
22000040: 587a37fd 0400005a 46b4d6e6 01210002    .7zXZ......F..!.
22000050: 00000016 a3e52f74 ef3b93e1 00005dff    ....t/....;..]..
22000060: 68caeea4 07fa8f83 dd905c6c a3918ccb    ...h....l\......
22000070: 909d8eac cc1177a8 7acf7427 c8668976    .....w..'t.zv.f.
22000080: 8c2bded9 40446de8 7c69be73 f24ffaf3    ..+..mD@s.i|..O.
22000090: 89c13f55 d07fdb26 ee616487 9fab9e46    U?..&....da.F...
220000a0: 91f6a7f4 11a1f851 fc341f01 ab57fae7    ....Q.....4...W.
220000b0: 822a3c67 9a14e408 f401cb55 21d54575    g<*.....U...uE.!
220000c0: 8c6107da 3ec7f930 fd9e6a48 8f462c70    ..a.0..>Hj..p,F.
220000d0: d67825cc 96fb0899 729f9296 9bd16e40    .%x........r@n..
220000e0: c7e1fbf6 f82442d9 7a7550b2 8204e085    .....B$..Puz....
220000f0: 69055244 d12f0ab4 e6e5dafe b51f73b2    DR.i../......s..

然后再运行bootm_decomp_image就可以子在0x20008000上看到解压的image

SSD202D # md 20008000 40
20008000: e28f9001 e12fff19 fa5af00c 8900f3ef    ....../...Z.....
20008010: 091af089 0f1ff019 091ff029 09d3f049    ........)...I...
20008020: 0920f049 f449d109 f20f7980 f3990e13    I. ...I..y......
20008030: f38e8f00 f3de8e30 f3898f00 ee108100    ....0...........
20008040: f0019f10 ea5ffa1e bf080a05 ba36f001    ......_.......6.
20008050: e893a30d eba30110 44a00404 f8cef000    ...........D....
20008060: f868f000 f8a6f000 f812f000 d014f8df    ..h.............
20008070: 0e0bf20f f8da46a0 44d4c010 f00146e7    .....F.....D.F..
20008080: 0000b987 c04792e1 c0008088 c0000000    ......G.........
20008090: 4400f508 4480f5a4 f04f4620 f5000300    ...D...D FO.....
200080a0: f8404680 f8403b04 f8403b04 f8403b04    .F@..;@..;@..;@.
200080b0: ea903b04 d1f40f06 7008f8da e890a01a    .;.........p....
200080c0: eba00068 44050003 ea4f4406 ea4f5515    h......D.DO..UO.
200080d0: ea475616 f8445305 42b53025 3501bf3c    .VG..SD.%0.B<..5
200080e0: f504e7f7 4e0f5040 0307ea48 4696eb04    ....@P.NH......F
200080f0: 3b04f840 1380f503 d9f942b0 5012ea4f    @..;.....B..O..P

获取对应的image后使用fdt addr 204afd20 即可获取到dtb

204afd20 = 20008000 + 4A7D20

4A7D20 = image前半段的大小

函数实现

 extern struct fdt_header *working_fdt;struct fdt_header * do_bootm_states_fdt(void)
{const void *os_hdr;ulong load_end;int ret = 0;images.os.load = 0x20008000;//解压后的地址images.os.image_start = 0x22000040;//去掉uimage头部的地址images.os.image_len =0x2547ac;//全部大小images.os.comp = 3;//解压方式.xz = 3images.os.type = 2;run_command("nand read.e 0x22000000 RECOVERY 0x300000", 0);ret = bootm_load_os_long(&images, &load_end, 0);run_command("fdt addr 204afd20", 0);run_command("fdt header", 0);return working_fdt;
}
	int len,err;int count;u32 cell[3*27];struct fdt_header *bootm_fdt;bootm_fdt=do_bootm_states_fdt();node = fdt_path_offset(bootm_fdt, "/soc/padmux");	val=fdt_getprop(bootm_fdt,node,"compatible",&len);	err = fdtdec_get_int_array(bootm_fdt, node, "schematic", cell,ARRAY_SIZE(cell));for(i=0;i<27;i++)printf("***: unknow power ctrl type %d[%d %d %d]\n",err,cell[i*3],cell[i*3+1],cell[i*3+2]);	
magic:                  0xd00dfeed
totalsize:              0x91aa (37290)
off_dt_struct:          0x38
off_dt_strings:         0x8cb0
off_mem_rsvmap:         0x28
version:                17
last_comp_version:      16
boot_cpuid_phys:        0x0
size_dt_strings:        0x4fa
size_dt_struct:         0x8c78
number mem_rsv:         0x0***: unknow power ctrl type [34796]***: unknow power ctrl type sstar-padmux[13]***: unknow power ctrl type 0[1 0 393474]***: unknow power ctrl type 0[2 16 393472]***: unknow power ctrl type 0[3 16 393473]***: unknow power ctrl type 0[4 52 524288]***: unknow power ctrl type 0[5 58 524544]***: unknow power ctrl type 0[6 0 327682]***: unknow power ctrl type 0[7 0 327683]***: unknow power ctrl type 0[8 45 458784]***: unknow power ctrl type 0[9 45 458785]***: unknow power ctrl type 0[11 0 397312]***: unknow power ctrl type 0[13 0 393475]***: unknow power ctrl type 0[17 0 196608]***: unknow power ctrl type 0[18 0 196609]***: unknow power ctrl type 0[15 30 458800]***: unknow power ctrl type 0[16 30 458801]***: unknow power ctrl type 0[49 40 458768]***: unknow power ctrl type 0[50 40 458769]***: unknow power ctrl type 0[0 0 131072]***: unknow power ctrl type 0[69 119 65536]***: unknow power ctrl type 0[70 119 65536]***: unknow power ctrl type 0[71 124 851968]***: unknow power ctrl type 0[79 126 917504]***: unknow power ctrl type 0[80 126 917504]***: unknow power ctrl type 0[81 126 917760]***: unknow power ctrl type 0[82 126 917760]***: unknow power ctrl type 0[85 101 721152]***: unknow power ctrl type 0[86 101 721153]

已经成功获取到dtb文件节点

相关文章:

SSD202D-UBOOT-FDT-获取DTB

因为一些需求,我们决定给uboot添加一个功能,在boot阶段识别获取出dtb,然后获取dts参数 DTS引脚是这样设置的 /* * infinity2m-ssc011a-s01a-padmux-display.dtsi- Sigmastar * * Copyright (c) [2019~2020] SigmaStar Technology. * * * This software is licensed under the …...

【Maven】Setting文件分享

<?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding …...

使用requestAnimationFrame 实现倒计时功能js(简单秒数倒计时)

拿一个简单的例子吧 就是获取验证码的倒计时 一般来说就是60秒 首先可能想到就是 setInterval let count 60 setInterval(() > { count --; }, 1000) 还有一种就是 setTImeout 函数的递归调用 let count 60 function coundown() { count --; if(count >…...

jenkins通过sshPut传输文件的时候,报错Permission denied的SftpException

一、背景 使用jenkins的ssh插件传输文件至远程机器的指定目录&#xff0c;php程序打包后&#xff0c;经过zip压缩为oms.zip zip -rq oms.zip ./ -x .git/* -x .env然后我们求md5值 md5sum oms.zip最后执行传输。 09:03:02 Executing command on ssh[116.61.10.149]: mkdir…...

【Python】数据分析+数据挖掘——探索Pandas中的数据筛选

1. 前言 当涉及数据处理和分析时&#xff0c;Pandas是Python编程语言中最强大、灵活且广泛使用的工具之一。Pandas提供了丰富的功能和方法&#xff0c;使得数据的选择、筛选和处理变得简单而高效。在本博客中&#xff0c;我们将重点介绍Pandas中数据筛选的关键知识点&#xff…...

[数据集][目标检测]天牛数据集目标检测数据集VOC格式3050张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;3050 标注数量(xml文件个数)&#xff1a;3050 标注类别数&#xff1a;1 标注类别名称:["longicorn"] …...

python_day16_设计模式

“”“单例模式”“” “”“工厂模式”“” class Person:passclass Worker(Person):passclass Student(Person):passclass Teacher(Person):passclass Factory:def get_person(self, p_type):if p_type w:return Worker()elif p_type s:return Student()else:return Te…...

uniapp开发小程序-实现中间凸起的 tabbar

一、效果展示&#xff1a; 二、代码实现&#xff1a; 1.首先在pages.json文件中进行tabbar的样式和列表配置&#xff0c;代码如下&#xff1a; {"pages": [ //pages数组中第一项表示应用启动页&#xff0c;参考&#xff1a;https://uniapp.dcloud.io/collocation/p…...

Vue引入与Vue拦截原理

1. vue引入 第一种方法&#xff1a;在线引入 <script src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 第二种方法&#xff1a;本地引入 2. Vue拦截原理——例题 el用于绑定id&#xff0c;data用于定义数据如下例题 <!DOCTYPE html&…...

2023年电赛---运动目标控制与自动追踪系统(E题)OpenMV方案

前言 &#xff08;1&#xff09;废话少说&#xff0c;很多人可能无法访问GitHub&#xff0c;所以我直接贴出可能要用的代码。此博客还会进行更新&#xff0c;先贴教程和代码 &#xff08;2&#xff09;视频教程&#xff1a; https://singtown.com/learn/49603/ &#xff08;3&a…...

6G内存运行Llama2-Chinese-7B-chat模型

6G内存运行Llama2-Chinese-7B-chat模型 Llama2-Chinese中文社区 第一步&#xff1a; 从huggingface下载 Llama2-Chinese-7b-Chat-GGML模型放到本地的某一目录。 第二步&#xff1a; 执行python程序 git clone https://github.com/Rayrtfr/llama2-webui.gitcd llama2-web…...

项目经理必备-项目总体计划模板-制式文件,可直接填写使用-公司可用

合同中完整项目名称&#xff0c;黑体&#xff0c;28号字&#xff0c; 居中对齐&#xff0c;项目名称较长时换行填写 当前文档名称&#xff0c;黑体&#xff0c;小初&#xff0c; 居中对齐&#xff0c;文档名称较长时 换行填写 版 本 号 x.x 编制人 日期 20xx年xx月xx日…...

正则表达式系列|(以xx开头xx结尾提取、切分、替换)

正则表达式系列|&#xff08;以xx开头xx结尾提取、切分、替换&#xff09; 文章目录 正则表达式系列|&#xff08;以xx开头xx结尾提取、切分、替换&#xff09;[TOC] 前言一、以xx开头xx结尾进行数据处理&#xff1f;1.以xx开头xx结尾对文本拆分2.以xx开头xx结尾提取内容3.以xx…...

金融学复习博迪(第1-5章)

第一部分 金融和金融体系 第1章 金融学 金融&#xff1a;资金的流通&#xff0c;即储蓄&#xff0c;信贷、汇兑、股票和证券交易等经济活动的总称。 金融学&#xff1a;研究货币流通的学问。 传统的金融学研究领域大致有两个方向&#xff1a; >宏观层面的金融市场运行理论…...

【前端知识】React 基础巩固(三十七)——自定义connect高阶组件

React 基础巩固(三十七)——自定义connect高阶组件 一、手撸一个自定义connect高阶组件 import { PureComponent } from "react"; import store from "../store";/*** connect的参数&#xff1a;* 参数一&#xff1a; 函数* 参数二&#xff1a; 函数* 返…...

前端PDF导出,使用html2Canvas和jsPDF插件

import html2Canvas from "html2canvas"; import jsPDF from "jspdf"; export function downloadPDF(dom, filename) {const scale 2;window.pageYOffset 0;// 滚动到顶部&#xff0c;避免打印不全document.documentElement.scrollTop 0;document.body.…...

Android 设备兼容性使用详解

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、设备兼容性分类二、硬件设备兼容三、软件 APP 兼容四、兼容不同语言五、兼容不同分辨率六、兼容不同屏幕方向布局七、兼容不同硬件 Feature八、兼容…...

vnc加固

0x00 认识VNC 先我们看看VNC运行的工作流程&#xff1a; VNC客户端通过浏览器或VNC Viewer连接至VNC Server&#xff1b; VNC Server传送一个对话窗口至客户端&#xff0c;要求输入连接密码&#xff08;可能为空&#xff09;&#xff0c;以及存取的VNC Server显示装置&#…...

Windows下Nginx安装与配置教程

一、前言 1、Nginx是什么&#xff1f; Nginx是一个开源的Web服务器&#xff0c;同时Nginx也提供了反向代理和负载均衡的功能。 Nginx通常作为负载均衡器暴露在外网接受用户请求&#xff0c;同时也使用其反向代理的功能&#xff0c;将用户的请求转发到实际提供服务的内网服务器…...

Iterator迭代器和Generator生成器

Iterator迭代器和for/of循环原理 Iterator迭代器规范 自己创建一个Iterator类,来实现ES6中的迭代器规范: class Iterator {constructor(assemble) {// assemble:需要迭代的数据结构this.assemble = assemble// index:记录迭代的次数(或者索引)this.index = -1}// 必须具…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...

41道Django高频题整理(附答案背诵版)

解释一下 Django 和 Tornado 的关系&#xff1f; Django和Tornado都是Python的web框架&#xff0c;但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架&#xff0c;鼓励快速开发和干净、实用的设计。它遵循MVC设计&#xff0c;并强调代码复用。Django有…...