《君正T31》4.修改Uboot

修改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升级了。内容放后面讲解把。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值