修改uboot默认变量
目前T31的Uboot主要存放再uboot/include/configs/isvp_t31.h中,修改里面的一些参数,DIY一下自己的uboot测试一下
每次感觉进入uboot都太快了,一下子就开机了,有时候会没反应过来就进不去uboot配置页面里了,改长一点。
之前提到的启动命令和内存分配,也是在这里面可以配置的,不过暂时也不太熟悉,先不改动吧
#ifdef CONFIG_SPL_MMC_SUPPORT
#define CONFIG_BOOTARGS BOOTARGS_COMMON " init=/linuxrc root=/dev/mmcblk0p2 rw rootdelay=1"
#elif defined(CONFIG_SFC_NOR)
#define CONFIG_BOOTARGS BOOTARGS_COMMON " init=/linuxrc rootfstype=squashfs root=/dev/mtdblock2 rw mtdparts=jz_sfc:256k(boot),2560k(kernel),2048k(root),-(appfs)"
#elif defined(CONFIG_SFC_NAND)
#define CONFIG_BOOTARGS BOOTARGS_COMMON " ip=off init=/linuxrc ubi.mtd=2 root=ubi0:rootfs ubi.mtd=3 rootfstype=ubifs rw"
#endif
#ifdef CONFIG_SPL_MMC_SUPPORT
#define CONFIG_BOOTCOMMAND "mmc read 0x80600000 0x1800 0x3000; bootm 0x80600000"
#endif
#ifdef CONFIG_SFC_NOR
#define CONFIG_BOOTCOMMAND "sf probe;sf read 0x80600000 0x40000 0x280000; bootm 0x80600000"
#endif /* CONFIG_SFC_NOR */
#ifdef CONFIG_SFC_NAND
#define CONFIG_BOOTCOMMAND "sfcnand read 0x100000 0x400000 0x80600000 ;bootm 0x80600000"
#endif
以及增加一些个性化的配置
增加uboot默认变量
照抄bootdelay
学习printenv函数
我们先从常见的printenv进行学习
#define ll_entry_declare(_type, _name, _list) \
_type _u_boot_list_2_##_list##_2_##_name __aligned(4) \
__attribute__((unused, \
section(".u_boot_list_2_"#_list"_2_"#_name)))
#define U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, \
_usage, _help, _comp) \
{ #_name, _maxargs, _rep, _cmd, _usage, \
_CMD_HELP(_help) _CMD_COMPLETE(_comp) }
#define U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, _comp) \
ll_entry_declare(cmd_tbl_t, _name, cmd) = \
U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd, \
_usage, _help, _comp);
struct cmd_tbl_s {
char *name; /* Command Name */// 命令名,用于匹配调用和展示
int maxargs; /* maximum number of arguments */ //最大参数限制
int repeatable; /* autorepeat allowed? */ //是否允许重复调用
/* Implementation function */
int (*cmd)(struct cmd_tbl_s *, int, int, char * const []); // name对应的执行函数
char *usage; /* Usage message (short) */ // 短提示,help中展示
#ifdef CONFIG_SYS_LONGHELP
char *help; /* Help message (long) */ // 长提示,help 对应指令时展示
#endif
#ifdef CONFIG_AUTO_COMPLETE
/* do auto completion on the arguments */
int (*complete)(int argc, char * const argv[], char last_char, int maxv, char *cmdv[]);
#endif
};
typedef struct cmd_tbl_s cmd_tbl_t;
U_BOOT_CMD_COMPLETE这个宏最终展开会变成一个定义了一个cmd_tbl_s类型的变量,然后存放到.u_boot_list_2_cmd_2段中。
然后执行命令时,会在.u_boot_list_2_cmd_1到.u_boot_list_2_cmd_3之间进行cmd查找,根据name进行匹配,找到以后再进行cmd_call调用(具体段的一些知识暂不了解,不拓展了),最终调用到用户自定义的执行函数中,如do_env_print
增加hello函数
参照前面的函数,实现一个hello函数,然后打印入参进行调试,通过上面的学习,我们也知道增加函数,就是定义宏,然后宏里会定义一个cmd_tbl_s的变量,存放到段 .u_boot_list_2_cmd_2中。
就一个小测试程序,我也懒得增加文件了,增加文件还得改makefile,直接再pr的后面追加吧
修改验证
捣鼓了这么久,原本内存久超了240k,现在再增加可能会更大吧,编译看看。
不出意外的话,还是出了意外
询问AI,发现可能时重复定义了,我把注释的宏去掉,就正常了,有点费解
emmm,忘记卖家改过以后,uboot分了256KB,还没超过,那就先不用考虑裁剪,烧机测试把
确保链路联通且IP正确
烧写uboot,重启
一顿操作猛如虎,完了,uboot一直重启,长按*也进不去了,完了,被我烧坏。。。。
后面看到提示,这个好像就是我自己加的那个,然后输入密码尝试了下,就进来了,这玩意太吓人了,等会还是给他删了吧。
再验证下其他的参数
修改uboot后的异常重启
不过转念一想,如果我没有输入密码,应该来说会直接启动内核,为什么会重启呢,看来还是有问题。
检查了下发现,启动内核执行的参数被修改了。
好在我保存了以前的参数,
setenv bootargs 'mem=40M@0x0 rmem=24M@0x2800000 console=ttyS1,115200n8 root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=jz_sfc:256K(Uboot),1792K(kernel),14336K(rootfs)';
setenv bootcmd 'sf probe;sf read 0x80600000 0x40000 0x1C0000; bootm 0x80600000';saveenv;reset
不过改完以后还是有点问题,起不来,检查命令参数也没有问题。
拿tftp重新加载到内核中的镜像和flash里的镜像数据做对比,发现的确不一致,暂时也没想清楚哪里写坏了,然后重新烧写镜像,reset就进来了。
不过这个还是存在一些问题,进入内核了,过了一段时间又重启了
login[93]: root login on 'console'
[root@Ingenic-g1_1:~]#
[ 66.211381] codec_codec_ctl: set CODEC_TURN_OFF...
[ 66.614949] codec_codec_ctl: set CODEC_SHUTDOWN...
[ 66.619921] Restarting system.
[ 66.623074] Restarting after 4 ms
U-Boot SPL 2013.07 (Apr 12 2025 - 22:33:19)
Timer init
CLK stop
PLL init
pll_init:366
重启之后数据又异常起不来了
换了个地址验证下,说明flash的地址的确是被uboot修改掉了,而不是仅仅内存中的数据被修改
确保我们flash是正常可写,没有写保护或者坏块,写入flash再读入新内存进行验证
然后改完以后,会好一段时间,这个时候重启也正常加载,那说明应该不是刚开机时uboot改了flash
发现当出现这个以后,数据就会异常。对比发现前面的内核头不正确,修改内核头,在内存中运行,发现又可以正常启动内核了。
很匪夷所思,不过再看看死机的原因,发现时加载驱动的时候出现了访问非法内存。导致启动内核后,出现了段错误,可能是段错误以后修改的吧。
这里我其实不太理解,Linux系统使用的内存分配大小是由bootargs给定的,
mem=42M@0x0 rmem=22M@0x2a00000 ,我也按照厂家计算的内存给用。
就算是kernel和rootfs我没调整,rootfs改回对应的文件系统格式rootfstype=jffs2就行了吧。
不理解,只能全部重新编译了。
uboot这个东西不熟悉最好还是不要轻易改动烧写,烧坏了tftp也升不了。
然后屋漏偏逢连夜雨,我又手贱,把uboot烧坏了。也就是没法通过tftp升级了。内容放后面讲解把。