u-boot-2012.04.01移植(六)提供nand flash启动支持

u-boot201707调试LS1046CPU的板子时串口无打印 将SFUQ(1046CPU)的boot从C600分支(2017 11) 移入到uniboot分支(src2017 07)中,移植内容主要增加了SFUQ的私有驱动, 目前,已经可以编译出u-boot.bin,移植过程中主要解决了一些未定义、重定义的变量和函数。 上板子调试后,发现串口没有任何输出,通过点灯发现,init_sequence_f中的如下串口初始化相关函数已经走完了。 init_baud_... 阅读详情

重新编译烧写,串口输出错误信息:

Flash:*** failed ***

### ERROR ### Please RESET the board

 

这个错误下一节再解决,这一节先为u-boot提供nand flash启动的支持

前面分析uboot时提到链接时加上-pie选项会生成位置无关码,将变量、函数的地址保存起来,以便于在uboot重定位代码时使用,这样虽然可以不指定程序的链接地址,但会导致程序增大,超过4k,不易使用nand启动,并且重定位代码复杂

修改办法:

1、修改Makefile去掉链接命令中的-pie选项

通过下面命令找到-pie的位置在arch/arm/config.mk的75行

grep “\-pie” * -nR

注释掉arch/arm/config.mk的75行

#LDFLAGS_u-boot += -pie

 

2、添加nand支持

①、修改board/samsung/smdk2440/Makefile

//COBJS	:= smdk2410.o
COBJS	:= smdk2410.o init.o

 

②、在board/samsung/smdk2440中新增一个文件init.c,提供nand flash的操作函数、启动flash类型的判断、代码重定位函数等等

/* NAND FLASH */
#define NFCONF (*((volatile unsigned long *)0x4E000000))
#define NFCONT (*((volatile unsigned long *)0x4E000004))
#define NFCMMD (*((volatile unsigned char *)0x4E000008))
#define NFADDR (*((volatile unsigned char *)0x4E00000C))
#define NFDATA (*((volatile unsigned char *)0x4E000010))
#define NFSTAT (*((volatile unsigned char *)0x4E000020))

//void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len);


static int isBootFromNorFlash(void)
{
	volatile int *p = (volatile int *)0;
	int val;

	val = *p;
	*p = 0x12345678;
	if (*p == 0x12345678)
	{
		*p = val;
		return 0;
	}

	return 1;
}

void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len)
{	
	int i = 0;
	
	if (isBootFromNorFlash())
	{
		while (i < len)
		{
			dest[i] = src[i];
			i++;
		}
	}
	else
	{
		nand_read((unsigned int)src, dest, len);
	}
}

void clear_bss(void)
{
	extern int __bss_start, __bss_end;
	int *p = &__bss_start;
	
	for (; p < &__bss_end; p++)
		*p = 0;
}

void nand_init_ll(void)
{
#define TACLS   0
#define TWRPH0  1
#define TWRPH1  0

	NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);
	NFCONT = (1<<4)|(1<<1)|(1<<0);	
}

static void nand_select(void)
{
	NFCONT &= ~(1<<1);	
}

static void nand_deselect(void)
{
	NFCONT |= (1<<1);	
}

static void nand_cmd(unsigned char cmd)
{
	volatile int i;
	
	NFCMMD = cmd;
	for (i = 0; i < 10; i++);
}

static void nand_addr(unsigned int addr)
{
	unsigned int col  = addr % 2048;
	unsigned int page = addr / 2048;
	volatile int i;

	NFADDR = col & 0xff;
	for (i = 0; i < 10; i++);
	NFADDR = (col >> 8) & 0xff;
	for (i = 0; i < 10; i++);
	
	NFADDR  = page & 0xff;
	for (i = 0; i < 10; i++);
	NFADDR  = (page >> 8) & 0xff;
	for (i = 0; i < 10; i++);
	NFADDR  = (page >> 16) & 0xff;
	for (i = 0; i < 10; i++);	
}

static void nand_wait_ready(void)
{
	while (!(NFSTAT & 1));
}

static unsigned char nand_data(void)
{
	return NFDATA;
}

void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len)
{
	int col = addr % 2048;
	int i = 0;
		
	nand_select();

	while (i < len)
	{
		nand_cmd(0x00);

		nand_addr(addr);

		nand_cmd(0x30);

		nand_wait_ready();

		for (; (col < 2048) && (i < len); col++)
		{
			buf[i] = nand_data();
			i++;
			addr++;
		}
		
		col = 0;
	}

	nand_deselect();
}

 

③、修改arch/arm/lib/board.c

修改board_init_f的返回值类型为unsigned int,并且对应修改其声明的返回值,注意要去掉__attribute__ ((noreturn)),声明位于include/common.h

 

在board_init_f函数中

Ⅰ、将

	addr -= gd->mon_len;
	addr &= ~(4096 - 1);

替换为

	addr = _TEXT_BASE;

指定一个固定的链接地址(u-boot在SDRAM上的起始地址)

Ⅱ、在函数头部添加一行,引用外部变量,变量等下会定义在start.S中,用于存放栈指针

extern ulong base_sp;

Ⅲ、在函数末尾
将

 relocate_code(addr_sp, id, addr);

替换为

base_sp = addr_sp;
return id;

保存栈指针,返回参数地址

 

④、修改arch/arm/cpu/arm920t/start.S,使用新的重定位、清除bss段代码,栈也需要重新设置

Ⅰ、

源代码:

call_board_init_f:
	ldr	sp, =(CONFIG_SYS_INIT_SP_ADDR)
	bic	sp, sp, #7 /* 8-byte alignment for ABI compliance */
	ldr	r0,=0x00000000
	bl	board_init_f

 

修改后:

	ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
	bic sp, sp, #7 /* 8-byte alignment for ABI compliance */

	bl nand_init_ll

	mov r0, #0
	ldr r1, _TEXT_BASE
	ldr r2, _bss_start_ofs
	bl copy_code_to_sdram
	bl clear_bss

	ldr	pc, =call_board_init_f

call_board_init_f:
	ldr	r0,=0x00000000
	bl	board_init_f
/*board_init_f返回值存于r0,用于传入board_init_r*/
ldr	r1, _TEXT_BASE
ldr	sp, base_sp
	bl	board_init_r

.globl base_sp
base_sp:
.long 0

为了让代码跳转到重定位后的位置,需要用绝对跳转指令ldr pc, =call_board_init_f(如果使用相对跳转指令bl,无法跳到SDRAM),跳转到SDRAM后即可使用相对跳转指令bl调用子程序

 

Ⅱ、删除这段重定位相关代码

	.globl	relocate_code
relocate_code:
	mov	r4, r0	/* save addr_sp */
	mov	r5, r1	/* save addr of gd */
	mov	r6, r2	/* save addr of destination */

	/* Set up the stack						    */
stack_setup:
	mov	sp, r4

	adr	r0, _start
	cmp	r0, r6
	beq	clear_bss		/* skip relocation */
	mov	r1, r6			/* r1 <- scratch for copy_loop */
	ldr	r3, _bss_start_ofs
	add	r2, r0, r3		/* r2 <- source end address	    */

copy_loop:
	ldmia	r0!, {r9-r10}		/* copy from source address [r0]    */
	stmia	r1!, {r9-r10}		/* copy to   target address [r1]    */
	cmp	r0, r2			/* until source end address [r2]    */
	blo	copy_loop

#ifndef CONFIG_SPL_BUILD
	/*
	 * fix .rel.dyn relocations
	 */
	ldr	r0, _TEXT_BASE		/* r0 <- Text base */
	sub	r9, r6, r0		/* r9 <- relocation offset */
	ldr	r10, _dynsym_start_ofs	/* r10 <- sym table ofs */
	add	r10, r10, r0		/* r10 <- sym table in FLASH */
	ldr	r2, _rel_dyn_start_ofs	/* r2 <- rel dyn start ofs */
	add	r2, r2, r0		/* r2 <- rel dyn start in FLASH */
	ldr	r3, _rel_dyn_end_ofs	/* r3 <- rel dyn end ofs */
	add	r3, r3, r0		/* r3 <- rel dyn end in FLASH */
fixloop:
	ldr	r0, [r2]		/* r0 <- location to fix up, IN FLASH! */
	add	r0, r0, r9		/* r0 <- location to fix up in RAM */
	ldr	r1, [r2, #4]
	and	r7, r1, #0xff
	cmp	r7, #23			/* relative fixup? */
	beq	fixrel
	cmp	r7, #2			/* absolute fixup? */
	beq	fixabs
	/* ignore unknown type of fixup */
	b	fixnext
fixabs:
	/* absolute fix: set location to (offset) symbol value */
	mov	r1, r1, LSR #4		/* r1 <- symbol index in .dynsym */
	add	r1, r10, r1		/* r1 <- address of symbol in table */
	ldr	r1, [r1, #4]		/* r1 <- symbol value */
	add	r1, r1, r9		/* r1 <- relocated sym addr */
	b	fixnext
fixrel:
	/* relative fix: increase location by offset */
	ldr	r1, [r0]
	add	r1, r1, r9
fixnext:
	str	r1, [r0]
	add	r2, r2, #8		/* each rel.dyn entry is 8 bytes */
	cmp	r2, r3
	blo	fixloop
#endif

clear_bss:
#ifndef CONFIG_SPL_BUILD
	ldr	r0, _bss_start_ofs
	ldr	r1, _bss_end_ofs
	mov	r4, r6			/* reloc addr */
	add	r0, r0, r4
	add	r1, r1, r4
	mov	r2, #0x00000000		/* clear			    */

clbss_l:str	r2, [r0]		/* clear loop...		    */
	add	r0, r0, #4
	cmp	r0, r1
	bne	clbss_l

	bl coloured_LED_init
	bl red_led_on
#endif

 

3、修改链接地址

修改include/configs/smdk2440.h

//#define CONFIG_SYS_TEXT_BASE 0
#define CONFIG_SYS_TEXT_BASE 0x33F00000

 

4、修改链接脚本,将重定位前所用到的文件放在最前面

通过下面命令找到链接脚本位置arch/arm/cpu

find -name *.lds | grep arm

修改链接脚本

源代码

        .text :
        {
                __image_copy_start = .;
                CPUDIR/start.o (.text)
                *(.text)
        }

修改后

        .text :
        {
                __image_copy_start = .;
                CPUDIR/start.o (.text)
                board/samsung/smdk2440/libsmdk2440.o (.text)
                *(.text)
        }

 

重新编译烧写后即支持nand flash启动

 

 

 

 

 

 

 

 

 

 

OpenHarmony南向设备开发:在标准系统上实现对rk系列芯片NPU的支持(驱动移植) 本文以 rk3568 为例,将 RKNPU 驱动移植到 OpenHarmony 使用的 kernel 5.10 中...... 阅读详情

相关推荐

ERROR ### Please RESET the board 不能烧录固件

解决方案: 按住 Maskrom 按键上电或复位,系统将进入 MaskRom 固件烧写模式。即可重新烧录固件。 附录: Rockchip 平台硬件运行的几种模式如表所示,只有当设备处于 Maskrom,及 Loader模式下,才能够烧写固件,或对板上固件进行更新操作。 进入烧写模式方式以下几种方法: 未烧录过固件,上电,进入 Maskrom 模式。 烧录过固件,按住 recovery 按键上电或复位,系统将进入 Loader 固件烧写模式。 烧录过固件,按住 Maskrom 按键上电或复位,系统将进入 M

小灰灰的博客 1万+

u-boot-2012.04.01移植(七)提供nor flash支持

无论系统从NOR启动还是从NAND启动,都会打印相同的错误信息 Flash:*** failed *** ### ERROR ### Please RESET the board 正常的打印信息应该是 Flash: 2M 2M表示Flash大小 显然这里Flash识别出错 通过下面命令定位错误在arch/arm/lib/board.c:506: grep "Flash...

floatinglong的博客 520

AI 生成 CAN 通信测试用例实战

本文分享了AI辅助汽车电子测试用例编写的实战经验。通过某车企CAN网络测试项目案例,对比传统方式(需27天)与AI辅助方式(仅5天)的效率差异,展示81%的效率提升。文章详细介绍了从DBC文件提取信号信息的方法,包括DBC文件结构解析、信号定义说明,并提供了完整的Python解析脚本代码,可将信号信息导出为JSON或Excel格式,为后续AI批量生成测试用例奠定基础。

小明的博客 694

uboot启动流程概述

一、uboot启动流程简介 与大多数BootLoader一样,uboot的启动过程分为BL1和BL2两个阶段。BL1阶段通常是开发板的配置等设备初始化代码,需要依赖依赖于SoC体系结构,通常用汇编语言来实现;BL2阶段主要是对外部设备如网卡、Flash等的初始化以及uboot命令集等的自身实现,通常用C语言来实现。 1、BL1阶段 uboot的BL1阶段代码通常放在start.s文件中,用汇编语言实现,其主要代码功能如下: (1) 指定uboot的入口。在链接脚本uboot.lds中指定uboot的入口为s

qq_37400022的博客 6105

保姆级教程:用TI IWR6843雷达板跑通3D人体追踪demo(附CCS/UniFlash避坑指南)

本文提供了一份详尽的TI IWR6843毫米波雷达开发板3D人体追踪demo实现指南,涵盖开发环境搭建、工程导入编译、固件烧录及可视化工具配置全流程。特别针对CCS和UniFlash使用中的常见问题给出解决方案,帮助开发者快速掌握3D People Tracking技术应用。

weixin_29159441的博客 508

离散数学 --- 图论基础 --- 图的同构,通路与回路,可达性与最短通路

同一个图(这里的图是抽象的数学定义)可以有不同的图形表示方法1.重数:两点之间的平行边的个数1.得到 n!的过程,一个图中的一个结点在另一个图中对应的结点有n种可能(黄框中定义的图来讨论),这个对应好后下一个结点有 n - 1 种可能,再下一个有n-2种,直到最后一个为1,所有可能的结果就等于 n * (n - 1) *(n - 2)*....*1 = n!2.虽然说找对应结点很困难,但不是没有规律可循的。比如1.两个相互对应的结点的度数要相同;

qq_51947882的博客 7441

TQ2440 u-boot-2012.04.01移植四支持NAND Flash

继 u-boot-2012.04.01移植二支持NOR Flash,继续修改代码支持NAND Flash。最后直接用NOR Flash里的u-boot烧写自己移植的u-boot到NAND,方便电脑没有并口或手上没有openjtag,照样能移植u-boot,当然有openjtag更方便。 开发环境: 系统:ubuntu 10.04.4 单板:tq2440 NAND FLASH:K9F1216

u010216127的专栏 1362

告别理论!手把手教你用Patran/Nastran搞定悬臂翼的颤振分析(附完整模型文件)

本文提供了一份详细的Patran/Nastran悬臂翼颤振分析实战指南,涵盖从几何建模到结果解读的全过程。通过手把手教学和完整模型文件,帮助工程师和学生快速掌握气动弹性分析技术,特别适合需要实际操作的初学者。文章重点介绍了模态分析、气动建模和颤振求解等关键步骤,并提供了常见问题排查和优化建议。

weixin_30879169的博客 493

【Linux 移植 】——4、移植 u-boot-2012.04.01 之 支持NAND启动

三、移植 u-boot-2012.04.01 之 支持NAND启动 需要进行修改和添加的文件: 1、添加的文件:init.c   包含NAND Flash 的相关配置  board/samsung/smdk2440目录, 修改Makefile 2、需要修改的文件: a、去掉-pie选项,修改arch/arm/config.mk b、start.S c、smdk2440.h d、co

Cawen的技术博客 970

Codex全网避坑实录|境外手机号封禁\+Ollama千问适配失败\+第三方中转站TOML全套配置

原生Codex:国内手机号百分百无法登录,PIN验证、多因子验证全部无效,不用尝试API Key登录:仅解锁界面,不充值无法使用功能,纯过渡方案Ollama本地千问:原生接口和Codex不兼容,手写Python代理大概率调试失败,不推荐折腾网页解析失败:只改wire_api为responses即可解决,无需修改接口地址使用建议:仅体验功能用中转站;长期办公提效,成本很高,建议改用兼容接口的本地模型。

驽马不舍 1906

【WRF-Urban运行】WRF-SLUCM耦合建模参数设置及模拟运行

WRF-SLUCM耦合建模参数设置及模拟运行

WW、forever的博客 1723

TQ2440 u-boot-2012.04.01移植二支持NAND启动

继 u-boot-2012.04.01移植一串口正常输出,继续修改代码支持单板NAND启动。最后直接用NOR Flash里的u-boot烧写自己移植的u-boot到NAND,方便电脑没有并口或手上没有openjtag,照样能移植u-boot,当然有openjtag更方便。 开发环境: 系统:ubuntu 10.04.4 单板:tq2440 NAND FLASH:K9F1216U0A 256

u010216127的专栏 1448

PCL 计算点云法向量并显示【2026最新版】

PCL计算法向量并显示,用OMP进行计算加速以及法线定向的深层次理解、操作。博客长期更新,本文最近更新时间为:2026年1月28日。

点云侠的博客 32万+

TQ2440 u-boot-2012.04.01移植一串口正常输出

开发环境: 系统:ubuntu 10.04.4 单板:tq2440 NAND FLASH:K9F1216U0A 256MB NOR Flash:EN29LV160AB 2MB SDRAM:HY57V561620 x2 64MB NET:DM9000AEP 编译器:arm-linux-gcc-4.3.2 搭建开发环境详见ubuntu 10.04.4开发环境配置。 目标: 1.支持

u010216127的专栏 1767

RK3568平台(USB篇)USB基础知识

现象:把USB设备比如Android手机接到PC答1:是USB控制器,是USB控制器内嵌的root hub.答2. windows里已经有了USB的总线驱动程序,接入USB设备后,是"总线驱动程序"知道你是"android phone"提示你安装的是"设备驱动程序"。USB总线驱动程序负责:识别USB设备, 给USB设备找到对应的驱动程序。答3. PC的USB口内部,D-和D+接有15K的下拉电阻,未接USB设备时为低电平USB设备的USB口内部,D-或D+接有1.5K的上拉电阻;

weixin_49303682的博客 1658

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ok6410 u-boot-2012.04.01移植五支持DM9000

继ok6410 u-boot-2012.04.01移植四后,开发板基本已支持MLC NAND,但还有一些细节地方修改,这节增加DM9000支持,通过网卡tftp程序到内存,接着通过NAND命令写到NAND,这一过程肯定会遇到很多问题,遇到后再一个个解决。 开发环境: 系统:ubuntu 10.04.4 单板:ok6410 NAND FLASH:K9GAG08U0D 2048MB NOR

u010216127的专栏 1770

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ok6410 u-boot-2012.04.01移植六完善MLC NAND支持

继ok6410 u-boot-2012.04.01移植四、五后,开发板基本已支持MLC NAND,支持DM9000.但是通过NAND命令更新u-boot到NAND,还存在问题,需要根据u-boot的nand命令继续修改,最终实现通过网卡tftp程序到内存,接着通过NAND命令写到NAND。 开发环境: 系统:ubuntu 10.04.4 单板:ok6410 NAND FLASH:K9GAG

u010216127的专栏 2161

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

uboot研读笔记 | 05 - 移植uboot 2012.04到JZ2440(支持Nand Flash读写)

在支持Nand Flash操作之前,首先要对Nand Flash的读写方法有一定的了解,参考文章: S3C2440-裸机篇-10 | 使用S3C2440操作Nand Flash 1. 去除nand flash屏蔽 在之前初步移植uboot时,发现开启nand flash之后编译不通过,所以屏蔽了nand flash的使用,在单板配置文件include/configs/smdk2440.h中开启...

Mculover666的博客(嵌入式) 2160

u-boot-2012.04.01 移植笔记

目标:把 u-boot-2012.04.01 移植到Jz2440开发板,并启动Linux内核 一、下载、建立source insight工程、编译、烧写、如果无运行分析原因 从官方网下载 u-boot-2012.04.01,并解压 tar xjf u-boot-2012.04.01.tar.bz2 进入u-boot-2012.04.01目录,并搜索查看该uboot是否支持s3c2440这...

Louis@L.M.的博客 1625

ok6410 u-boot-2012.04.01移植四增加MLC NAND支持

继ok6410 u-boot-2012.04.01移植三后,单板已具备下载程序,只需一根串口线就能下载程序。其实u-boot基本上已可以使用,在以后一步步完善u-boot。查看NAND型号,发现是MLC NAND,就又痛了,市场上一般开发板都是SCL NAND,并且MLC NAND操作起来复杂些,查看了很多资料,最终移植成功,放在这里与大家分享。 开发环境: 系统:ubuntu 10.04.4

u010216127的专栏 2416

TQ2440 u-boot-2012.04.01移植三支持NOR Flash

继 u-boot-2012.04.01移植二支持NAND启动,继续修改代码支持NAND Flash、NOR Flash。最后直接用NOR Flash里的u-boot烧写自己移植的u-boot到NAND,方便电脑没有并口或手上没有openjtag,照样能移植u-boot,当然有openjtag更方便。 开发环境: 系统:ubuntu 10.04.4 单板:tq2440 NAND FLASH:

u010216127的专栏 1962

ok6410 u-boot-2012.04.01移植七完善u-boot移植(u-boot移植结束)

继ok6410 u-boot-2012.04.01移植六后,开发板已支持MLC NAND、DM9000等。但还需要完善比如环境变量、mtdpart分区、裁剪、制作补丁等。下面的工作就是完善移植的u-boot。 开发环境: 系统:ubuntu 10.04.4 单板:ok6410 NAND FLASH:K9GAG08U0D 2048MB NOR Flash:EN29LV160AB 2MB

u010216127的专栏 1907

移植u-boot-2012.04.01到s3c2440

看了韦东山老师的u-boot-2012.04.01移植,然后把大概移植内容整理了一下,如下。 开发环境: u-boot-2012.04.01 arm-linux-gcc-4.3.2.tar 1.环境配置: 老版本的gcc编译器编译时有问题,所以使用4.3.2 解压到根目录: book@book-desktop:/work/tools$sudo tar xjf arm-li

qq361294382的博客 738

移植u-boot-2012.04.01到JZ2440(三:修改源码之实现NOR启动与NAND启动)

目录 3. 修改源码之实现从NOR启动与NAND启动     3.1 前言    3.2 实现从NOR启动        3.2.1 修改设置时钟            3.2.1.1 CLKDIVN寄存器            3.2.1.2 总线模式            3.2.1.3 MPLL寄存器            3.2.1.4 修改源码        3.2.2 修改初始化存...

墨、白的博客 1227

移植u-boot-2012.04.01到JZ2440(四:修改源码之支持NOR Flash与NAND Flash)

目录 4. 修改源码之识别NOR Flash与NAND Flash     4.1 修改源码之识别NOR Flash        4.1.1 打开DEBUG调试        4.1.2 分析flash_init()函数        4.1.3 分析flash_detect_legacy()函数        4.1.4 分析jedec_flash_match()函数        4.1...

墨、白的博客 896

mini2440移植最新u-boot-2012.04.01详细解说

mini2440移植最新u-boot-2012.04.01详细解说 MINI2440开发板硬件环境 nor flash型号:SST39VF1601 nand flash型号:K9F1208 网卡型号:DM9000E 内核分区:4MB 使用4.3.2的...

dieling4341的博客 381
上一篇: u-boot-2012.04.01移植(五)修改串口初始化代码
下一篇: u-boot-2012.04.01移植(七)提供nor flash支持
floatinglong
博客等级 码龄9年 90粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值