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

Luckfox Pico Pro Max SD 卡镜像扩容方法

比较头疼的是rv1106 ubuntu镜像的分区表不是标准的gpt格式,镜像烧写后rootfs是6gb,

sd 卡是32gb,想要使用更多空间,需要进行分区调整

最后效果请看:

操作步骤的尝试

(1)烧录sd卡

(2)DG 打开SD卡发现问题,没有任何分区

(3)用DG找到rootfs分区,记录其前面一共有多少内容

(4)winhex备份rootfs之前的所有数据,大概800多MB

(5)将sd卡重建一下gpt分区表,只保留rootfs

(6)扩容rootfs到26GB,这个数值必须是26*1024*1024*1024字节

(7)重新将(4)中备份数据刷回sd卡的rootfs前面的位置,此时已经完成扩容,但需要调整rk私有分区表

(8)用hex工具查看一下env.img 

完全可以调整,从6G调整为26G

(9)上电,结果是进不去系统

(10)连接串口,发现如下错误

这样看,应该是修改的env.img 部分的crc校验和错了,

(11)从sdk代码搜索这条日志的代码

(12)将crc代码扒出来自己写一个crc校验工具

#include <stdio.h>
#include <string.h>
#include <new>using namespace std;typedef unsigned int uint32_t;
typedef unsigned char Bytef;
typedef unsigned char uint8_t;
typedef unsigned int uInt;#define cpu_to_le32(x) x
#define le32_to_cpu(x) xuint32_t htonl(uint32_t x)
{uint32_t r = 0;unsigned char* a = (unsigned char*)&x;unsigned char* b = (unsigned char*)&r;b[0] = a[3];b[1] = a[2];b[2] = a[1];b[3] = a[0];return r;
}/** This file is derived from crc32.c from the zlib-1.1.3 distribution* by Jean-loup Gailly and Mark Adler.*//* crc32.c -- compute the CRC-32 of a data stream* Copyright (C) 1995-1998 Mark Adler* For conditions of distribution and use, see copyright notice in zlib.h*/#ifdef USE_HOSTCC
#include <arpa/inet.h>
#else#endif#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
#include <watchdog.h>
#endif#define local static
#define ZEXPORT	/* empty */#define tole(x) cpu_to_le32(x)#ifdef DYNAMIC_CRC_TABLElocal int crc_table_empty = 1;
local uint32_t crc_table[256];
local void make_crc_table OF((void));/*Generate a table for a byte-wise 32-bit CRC calculation on the polynomial:x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.Polynomials over GF(2) are represented in binary, one bit per coefficient,with the lowest powers in the most significant bit.  Then adding polynomialsis just exclusive-or, and multiplying a polynomial by x is a right shift byone.  If we call the above polynomial p, and represent a byte as thepolynomial q, also with the lowest power in the most significant bit (so thebyte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,where a mod b means the remainder after dividing a by b.This calculation is done using the shift-register method of multiplying andtaking the remainder.  The register is initialized to zero, and for eachincoming bit, x^32 is added mod p to the register if the bit is a one (wherex^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p byx (which is shifting right by one and adding x^32 mod p if the bit shiftedout is a one).  We start with the highest power (least significant bit) ofq and repeat for all eight bits of q.The table is simply the CRC of all possible eight bit values.  This is allthe information needed to generate CRC's on data a byte at a time for allcombinations of CRC register values and incoming bytes.
*/
local void make_crc_table()
{uint32_t c;int n, k;uLong poly;		/* polynomial exclusive-or pattern *//* terms of polynomial defining this crc (except x^32): */static const Byte p[] = { 0,1,2,4,5,7,8,10,11,12,16,22,23,26 };/* make exclusive-or pattern from polynomial (0xedb88320L) */poly = 0L;for (n = 0; n < sizeof(p) / sizeof(Byte); n++)poly |= 1L << (31 - p[n]);for (n = 0; n < 256; n++){c = (uLong)n;for (k = 0; k < 8; k++)c = c & 1 ? poly ^ (c >> 1) : c >> 1;crc_table[n] = tole(c);}crc_table_empty = 0;
}
#else/* ========================================================================* Table of CRC-32's of all single-byte values (made by make_crc_table)*/static  const uint32_t crc_table[256] = {
tole(0x00000000L), tole(0x77073096L), tole(0xee0e612cL), tole(0x990951baL),
tole(0x076dc419L), tole(0x706af48fL), tole(0xe963a535L), tole(0x9e6495a3L),
tole(0x0edb8832L), tole(0x79dcb8a4L), tole(0xe0d5e91eL), tole(0x97d2d988L),
tole(0x09b64c2bL), tole(0x7eb17cbdL), tole(0xe7b82d07L), tole(0x90bf1d91L),
tole(0x1db71064L), tole(0x6ab020f2L), tole(0xf3b97148L), tole(0x84be41deL),
tole(0x1adad47dL), tole(0x6ddde4ebL), tole(0xf4d4b551L), tole(0x83d385c7L),
tole(0x136c9856L), tole(0x646ba8c0L), tole(0xfd62f97aL), tole(0x8a65c9ecL),
tole(0x14015c4fL), tole(0x63066cd9L), tole(0xfa0f3d63L), tole(0x8d080df5L),
tole(0x3b6e20c8L), tole(0x4c69105eL), tole(0xd56041e4L), tole(0xa2677172L),
tole(0x3c03e4d1L), tole(0x4b04d447L), tole(0xd20d85fdL), tole(0xa50ab56bL),
tole(0x35b5a8faL), tole(0x42b2986cL), tole(0xdbbbc9d6L), tole(0xacbcf940L),
tole(0x32d86ce3L), tole(0x45df5c75L), tole(0xdcd60dcfL), tole(0xabd13d59L),
tole(0x26d930acL), tole(0x51de003aL), tole(0xc8d75180L), tole(0xbfd06116L),
tole(0x21b4f4b5L), tole(0x56b3c423L), tole(0xcfba9599L), tole(0xb8bda50fL),
tole(0x2802b89eL), tole(0x5f058808L), tole(0xc60cd9b2L), tole(0xb10be924L),
tole(0x2f6f7c87L), tole(0x58684c11L), tole(0xc1611dabL), tole(0xb6662d3dL),
tole(0x76dc4190L), tole(0x01db7106L), tole(0x98d220bcL), tole(0xefd5102aL),
tole(0x71b18589L), tole(0x06b6b51fL), tole(0x9fbfe4a5L), tole(0xe8b8d433L),
tole(0x7807c9a2L), tole(0x0f00f934L), tole(0x9609a88eL), tole(0xe10e9818L),
tole(0x7f6a0dbbL), tole(0x086d3d2dL), tole(0x91646c97L), tole(0xe6635c01L),
tole(0x6b6b51f4L), tole(0x1c6c6162L), tole(0x856530d8L), tole(0xf262004eL),
tole(0x6c0695edL), tole(0x1b01a57bL), tole(0x8208f4c1L), tole(0xf50fc457L),
tole(0x65b0d9c6L), tole(0x12b7e950L), tole(0x8bbeb8eaL), tole(0xfcb9887cL),
tole(0x62dd1ddfL), tole(0x15da2d49L), tole(0x8cd37cf3L), tole(0xfbd44c65L),
tole(0x4db26158L), tole(0x3ab551ceL), tole(0xa3bc0074L), tole(0xd4bb30e2L),
tole(0x4adfa541L), tole(0x3dd895d7L), tole(0xa4d1c46dL), tole(0xd3d6f4fbL),
tole(0x4369e96aL), tole(0x346ed9fcL), tole(0xad678846L), tole(0xda60b8d0L),
tole(0x44042d73L), tole(0x33031de5L), tole(0xaa0a4c5fL), tole(0xdd0d7cc9L),
tole(0x5005713cL), tole(0x270241aaL), tole(0xbe0b1010L), tole(0xc90c2086L),
tole(0x5768b525L), tole(0x206f85b3L), tole(0xb966d409L), tole(0xce61e49fL),
tole(0x5edef90eL), tole(0x29d9c998L), tole(0xb0d09822L), tole(0xc7d7a8b4L),
tole(0x59b33d17L), tole(0x2eb40d81L), tole(0xb7bd5c3bL), tole(0xc0ba6cadL),
tole(0xedb88320L), tole(0x9abfb3b6L), tole(0x03b6e20cL), tole(0x74b1d29aL),
tole(0xead54739L), tole(0x9dd277afL), tole(0x04db2615L), tole(0x73dc1683L),
tole(0xe3630b12L), tole(0x94643b84L), tole(0x0d6d6a3eL), tole(0x7a6a5aa8L),
tole(0xe40ecf0bL), tole(0x9309ff9dL), tole(0x0a00ae27L), tole(0x7d079eb1L),
tole(0xf00f9344L), tole(0x8708a3d2L), tole(0x1e01f268L), tole(0x6906c2feL),
tole(0xf762575dL), tole(0x806567cbL), tole(0x196c3671L), tole(0x6e6b06e7L),
tole(0xfed41b76L), tole(0x89d32be0L), tole(0x10da7a5aL), tole(0x67dd4accL),
tole(0xf9b9df6fL), tole(0x8ebeeff9L), tole(0x17b7be43L), tole(0x60b08ed5L),
tole(0xd6d6a3e8L), tole(0xa1d1937eL), tole(0x38d8c2c4L), tole(0x4fdff252L),
tole(0xd1bb67f1L), tole(0xa6bc5767L), tole(0x3fb506ddL), tole(0x48b2364bL),
tole(0xd80d2bdaL), tole(0xaf0a1b4cL), tole(0x36034af6L), tole(0x41047a60L),
tole(0xdf60efc3L), tole(0xa867df55L), tole(0x316e8eefL), tole(0x4669be79L),
tole(0xcb61b38cL), tole(0xbc66831aL), tole(0x256fd2a0L), tole(0x5268e236L),
tole(0xcc0c7795L), tole(0xbb0b4703L), tole(0x220216b9L), tole(0x5505262fL),
tole(0xc5ba3bbeL), tole(0xb2bd0b28L), tole(0x2bb45a92L), tole(0x5cb36a04L),
tole(0xc2d7ffa7L), tole(0xb5d0cf31L), tole(0x2cd99e8bL), tole(0x5bdeae1dL),
tole(0x9b64c2b0L), tole(0xec63f226L), tole(0x756aa39cL), tole(0x026d930aL),
tole(0x9c0906a9L), tole(0xeb0e363fL), tole(0x72076785L), tole(0x05005713L),
tole(0x95bf4a82L), tole(0xe2b87a14L), tole(0x7bb12baeL), tole(0x0cb61b38L),
tole(0x92d28e9bL), tole(0xe5d5be0dL), tole(0x7cdcefb7L), tole(0x0bdbdf21L),
tole(0x86d3d2d4L), tole(0xf1d4e242L), tole(0x68ddb3f8L), tole(0x1fda836eL),
tole(0x81be16cdL), tole(0xf6b9265bL), tole(0x6fb077e1L), tole(0x18b74777L),
tole(0x88085ae6L), tole(0xff0f6a70L), tole(0x66063bcaL), tole(0x11010b5cL),
tole(0x8f659effL), tole(0xf862ae69L), tole(0x616bffd3L), tole(0x166ccf45L),
tole(0xa00ae278L), tole(0xd70dd2eeL), tole(0x4e048354L), tole(0x3903b3c2L),
tole(0xa7672661L), tole(0xd06016f7L), tole(0x4969474dL), tole(0x3e6e77dbL),
tole(0xaed16a4aL), tole(0xd9d65adcL), tole(0x40df0b66L), tole(0x37d83bf0L),
tole(0xa9bcae53L), tole(0xdebb9ec5L), tole(0x47b2cf7fL), tole(0x30b5ffe9L),
tole(0xbdbdf21cL), tole(0xcabac28aL), tole(0x53b39330L), tole(0x24b4a3a6L),
tole(0xbad03605L), tole(0xcdd70693L), tole(0x54de5729L), tole(0x23d967bfL),
tole(0xb3667a2eL), tole(0xc4614ab8L), tole(0x5d681b02L), tole(0x2a6f2b94L),
tole(0xb40bbe37L), tole(0xc30c8ea1L), tole(0x5a05df1bL), tole(0x2d02ef8dL)
};
#endif#if 0
/* =========================================================================* This function can be used by asm versions of crc32()*/
const uint32_t * ZEXPORT get_crc_table()
{
#ifdef DYNAMIC_CRC_TABLEif (crc_table_empty) make_crc_table();
#endifreturn (const uint32_t *)crc_table;
}
#endif/* ========================================================================= */
# if __BYTE_ORDER == __LITTLE_ENDIAN
#  define DO_CRC(x) crc = tab[(crc ^ (x)) & 255] ^ (crc >> 8)
# else
#  define DO_CRC(x) crc = tab[((crc >> 24) ^ (x)) & 255] ^ (crc << 8)
# endif/* ========================================================================= *//* No ones complement version. JFFS2 (and other things ?)* don't use ones compliment in their CRC calculations.*/
uint32_t ZEXPORT crc32_no_comp(uint32_t crc, const Bytef *buf, uInt len)
{const uint32_t *tab = crc_table;const uint32_t *b = (const uint32_t *)buf;size_t rem_len;
#ifdef DYNAMIC_CRC_TABLEif (crc_table_empty)make_crc_table();
#endifcrc = cpu_to_le32(crc);/* Align it */if (((long)b) & 3 && len) {uint8_t *p = (uint8_t *)b;do {DO_CRC(*p++);} while ((--len) && ((long)p) & 3);b = (uint32_t *)p;}rem_len = len & 3;len = len >> 2;for (--b; len; --len) {/* load data 32 bits wide, xor data 32 bits wide. */crc ^= *++b; /* use pre increment for speed */DO_CRC(0);DO_CRC(0);DO_CRC(0);DO_CRC(0);}len = rem_len;/* And the last few bytes */if (len) {uint8_t *p = (uint8_t *)(b + 1) - 1;do {DO_CRC(*++p); /* use pre increment for speed */} while (--len);}return le32_to_cpu(crc);
}
#undef DO_CRCuint32_t ZEXPORT crc32(uint32_t crc, const Bytef *p, uInt len)
{return crc32_no_comp(crc ^ 0xffffffffL, p, len) ^ 0xffffffffL;
}/** Calculate the crc32 checksum triggering the watchdog every 'chunk_sz' bytes* of input.*/
uint32_t ZEXPORT crc32_wd(uint32_t crc,const unsigned char *buf,uInt len, uInt chunk_sz)
{
#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)const unsigned char *end, *curr;int chunk;curr = buf;end = buf + len;while (curr < end) {chunk = end - curr;if (chunk > chunk_sz)chunk = chunk_sz;crc = crc32(crc, curr, chunk);curr += chunk;WATCHDOG_RESET();}
#elsecrc = crc32(crc, buf, len);
#endifreturn crc;
}void crc32_wd_buf(const unsigned char *input, unsigned int ilen,unsigned char *output, unsigned int chunk_sz)
{uint32_t crc;crc = crc32_wd(0, input, ilen, chunk_sz);crc = htonl(crc);memcpy(output, &crc, sizeof(crc));
}#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
# define ENV_HEADER_SIZE	(sizeof(uint32_t) + 1)
#else
# define ENV_HEADER_SIZE	(sizeof(uint32_t))
#endiftypedef struct environment_s {uint32_t	crc;		/* CRC32 over data bytes	*/
#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENTunsigned char	flags;		/* active/obsolete flags	*/
#endifunsigned char	data[0]; /* Environment data		*/
} env_t;int main()
{printf("input env.img path:");char buf[1024] = {};scanf("%s", buf);FILE* fp = fopen(buf, "rb");if (fp){fseek(fp, 0, SEEK_END);long flen = ftell(fp);fseek(fp, 0, SEEK_SET);unsigned char* pFileData = new(nothrow) unsigned char[flen];if (pFileData){fread(pFileData, 1, flen, fp);env_t* env = (env_t*)pFileData;uint32_t data_size = flen - ENV_HEADER_SIZE;uint32_t calcCrc = crc32(0, env->data, data_size);printf("calc crc=%08X\n", calcCrc);if (calcCrc != env->crc) {printf("!bad CRC @ 0x%x\n", 0);}else{printf("crc ok\n");}delete[] pFileData;}fclose(fp);}return 0;
}

用这个工具重新测试计算crc,然后修改env.img重新写入sd卡即可

http://www.xdnf.cn/news/1054927.html

相关文章:

  • Spark核心概念与DAG执行原理笔记
  • Skip-Gram CBOW
  • 通达信 玄学首板 抓首版指标
  • 深入探索Joomla子模板:解决模板更新覆盖问题的终极方案​
  • 调和级数 发散 P级数判别法
  • git 开源平台网站推荐 (2025-06 更新)
  • hot100 -- 14.贪心算法
  • 土建施工安全管理难?免费AI系统 24h 监控预警
  • Android16变更
  • NodeJS哪些情况下会造成内存泄漏和避免方法
  • Unity3D仿星露谷物语开发63之NPC移动
  • 多模态大语言模型arxiv论文略读(122)
  • SAP实施服务专家——哲讯科技,赋能企业智慧升级
  • DAY 50 超大力王爱学Python
  • ROS2中,如果对rviz格式文件做了修改,都需要重新编译才可以launch出新的rviz配置对么?
  • 4,QT文件操作
  • 02-D3.js 控制横向柱图切换数据带动画效果
  • 创始人IP如何崛起:系统化打造的实践路径 | 创客匠人
  • web性能优化
  • 动态规划之斐波那契数(一)
  • 【已解决】bash: /usr/bin/perl: bad interpreter: No such file or directory
  • UI学习汇总
  • Yocto vs Buildroot:SDK(软件开发套件)创建能力全面对比
  • 快速入门多线程(一):线程生命周期详解(附流程图详解)
  • Python数字信号处理——利用块间系数相关性的DCT域鲁棒盲图像水印(PyQT5界面)
  • 【分析学】 实数
  • Spring事务传播机制深度解析
  • c++类型擦除
  • DNS递归查询步骤
  • 2. Anaconda 的安装及 Pytorch 环境安装