uboot——lowleve_init.S分析

lowlevel_init 函数分析 lowlevel_init函数主要用做底层的初始化,在start.S中确定启动介质后就要调用这个函数。uboo\board\samsung\x210 文章目录 阅读详情
rarlowleve_init.S分析
/*
 * Memory Setup stuff - taken from blob memsetup.S
 *
 * Copyright (C) 1999 2000 2001 Erik Mouw ( J.A.K.Mouw@its.tudelft.nl) and
 *                     Jan-Derk Bakker ( J.D.Bakker@its.tudelft.nl)
 *
 * Modified for the Samsung SMDK2410 by
 * (C) Copyright 2002
 * David Mueller, ELSOFT AG, < d.mueller@elsoft.ch>
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * 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 for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */
 

#include <config.h>
#include <version.h>
 

/* some parameters for the board */
 
/*
 *
 * Taken from linux/arch/arm/boot/compressed/head-s3c2410.S
 *
 * Copyright (C) 2002 Samsung Electronics SW.LEE  < hitchcar@sec.samsung.com>
 *
 */
@我的开发板上的SDRAM为:HY57V561620FTP-H,4Mx16bitx4Banks,两片接成32bit,64MB,接在BANK6上,地址范围为:[0x30000000-0x33ffffff]
@(还没搞清楚SDRAM的结构,为什么要分成Banks,改天看下相关的文档研究一下)
@对于SDRAM的初始化是要配置13个寄存器,好像多采用循环方式。
 
#define BWSCON 0x48000000
@BWSCON寄存器地址,控制每个总线
 
/* BWSCON */
#define DW8   (0x0)
#define DW16   (0x1)
#define DW32   (0x2)
@将用来设置位宽的三个宏
#define WAIT   (0x1<<2)
#define UBLB   (0x1<<3)
@将用来设置wait和ublb的宏
 
#define B1_BWSCON  (DW32)
#define B2_BWSCON  (DW16)
#define B3_BWSCON  (DW16 + WAIT + UBLB)
#define B4_BWSCON  (DW16)
#define B5_BWSCON  (DW16)
@BANK2、BANK3、BANK4、BANK5为什么配成16bit总线宽度,而且BANK3还要加上WAIT和UBLB属性没有搞明白,感觉如果没用到的话可以配成默认值的吧?
#define B6_BWSCON  (DW32)
#define B7_BWSCON  (DW32)
@我板子的SDRAM接在BANK6,所以配成32bit位宽,BANK7按datasheet的要求配置的和BANK6相同
 
@分别配置每个BANK的BANKCON寄存器,这里应该根据SRAM的手册来配置相应的BANK,BANK0~5主要是配置一些时序参数
/* BANK0CON */
#define B0_Tacs   0x0 /*  0clk */
#define B0_Tcos   0x0 /*  0clk */
#define B0_Tacc   0x7 /* 14clk */
#define B0_Tcoh   0x0 /*  0clk */
#define B0_Tah   0x0 /*  0clk */
#define B0_Tacp   0x0
#define B0_PMC   0x0 /* normal */
 
/* BANK1CON */
#define B1_Tacs   0x0 /*  0clk */
#define B1_Tcos   0x0 /*  0clk */
#define B1_Tacc   0x7 /* 14clk */
#define B1_Tcoh   0x0 /*  0clk */
#define B1_Tah   0x0 /*  0clk */
#define B1_Tacp   0x0
#define B1_PMC   0x0
 
#define B2_Tacs   0x0
#define B2_Tcos   0x0
#define B2_Tacc   0x7
#define B2_Tcoh   0x0
#define B2_Tah   0x0
#define B2_Tacp   0x0
#define B2_PMC   0x0
 
@这里BANK3CON不为默认值,是因为在SMDK2410上BANK3上应该接了ROM
@根据我自己的板子,我把这里换成了默认值(根据vivi上的默认值修改的),不过要不是默认值的话应该也没有影响的吧?我的板子这里接了DM9000A

#define B3_Tacs   0x0 /*  0clk */
#define B3_Tcos   0x3 /*  4clk */
#define B3_Tacc   0x7 /* 14clk */
#define B3_Tcoh   0x1 /*  1clk */
#define B3_Tah   0x0 /*  0clk */
#define B3_Tacp   0x3     /*  6clk */
#define B3_PMC   0x0 /* normal */
 
#define B4_Tacs   0x0 /*  0clk */
#define B4_Tcos   0x0 /*  0clk */
#define B4_Tacc   0x7 /* 14clk */
#define B4_Tcoh   0x0 /*  0clk */
#define B4_Tah   0x0 /*  0clk */
#define B4_Tacp   0x0
#define B4_PMC   0x0 /* normal */
 
#define B5_Tacs   0x0 /*  0clk */
#define B5_Tcos   0x0 /*  0clk */
#define B5_Tacc   0x7 /* 14clk */
#define B5_Tcoh   0x0 /*  0clk */
#define B5_Tah   0x0 /*  0clk */
#define B5_Tacp   0x0
#define B5_PMC   0x0 /* normal */
 
@配置SDRAM的参数,BANK6和BANK7要配置成同样的值,需要查看SDRAM的datasheet
@当内存为ROM或SRAM时需要配置所有位,当为SDRAM时只要配置[0~3]
#define B6_MT   0x3 /* SDRAM */
@内存类型,默认为SDRAM
#define B6_Trcd   0x1
@RAS到CAS的延时
#define B6_SCAN   0x1 /* 9bit */
@列扫描数,在SDRAM手册上,有一句:C0~C8即为9列
 
#define B7_MT   0x3 /* SDRAM */
#define B7_Trcd   0x1 /* 3clk */
#define B7_SCAN   0x1 /* 9bit */
 
/* REFRESH parameter */
@SDRAM刷新参数,这个很重要,移植时要更改
#define REFEN   0x1 /* Refresh enable */
@默认为允许刷新
#define TREFMD   0x0 /* CBR(CAS before RAS)/Auto refresh */
@据说下面三个时间参数多是根据经验来设置
#define Trp   0x0 /* 2clk */
@RAS precharge Time
#define Trc   0x3 /* 7clk */
@根据S3C2440的datasheet为:Trc=Tsrc+Trp,但寄存器中要填入的是Tsrc,这里仿佛应该设为10个时钟才对?
#define Tchr   0x2 /* 3clk */
@SDRAM手册上没有找到这个时钟的定义
#define REFCNT   1113 /* period="15".6us, HCLK="60Mhz", (2048+1-15.6*60) */
@SDRAM刷新计数值,这个值比较重要,根据SDRAM的datasheet,(我使用的这款芯片在datasheet写着8192Refresh cycle/64ms,所以一个刷新周期为64ms/8192=7.8125us,取7.9的话REFCNT的值就为1259)
/**************************************/
 
_TEXT_BASE:
 .word TEXT_BASE
 
@这里开始lowlevel_init函数了,通过循环连续初始化13个寄存器
.globl lowlevel_init
lowlevel_init:
 /* memory control configuration */
 /* make r0 relative the current location so that it */
 /* reads SMRDATA out of FLASH rather than memory ! */
 ldr     r0, =SMRDATA
 ldr r1, _TEXT_BASE
@r1放代码段的开始位置
 sub r0, r0, r1
    //计算SMRDATA的相对地址保存到R0中
    //SMRDATA为虚拟地址,而TEXT_BASE为虚拟地址的起始地址
    //而现在Uboot的起始地址并不为虚拟地址
    //TEXT_BASE为0x33F8 0000,SMRDATA为0x33F8 06C8
    //而现在程序运行在起始地址为0x0000 0000的地方
    //所以需要计算以0x0000 0000为标准的相对地址
(参考uboot-1.3.0-rc3引导启动学习笔记,这一段确实要好好理解)
 ldr r1, =BWSCON /* Bus Width Status Controller */
 add     r2, r0, #13*4
@13个寄存器,每个寄存器占4个字节
@读取一个值存入寄存器中,然后循环,直到读完13个寄存器

0:
 ldr     r3, [r0], #4
 str     r3, [r1], #4
 cmp     r2, r0
 bne     0b
 
 /* everything is fine now */
 mov pc, lr
@程序返回到cpu_init_crit中
 
 .ltorg
/* the literal pools origin */
 
SMRDATA:
    .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
@设置每个BWSCON,注意BANK0由硬件连线决定了。
    .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
    .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
    .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
    .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
    .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
    .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
@设置BANKCON0~BANKCON5
    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
@设置BANKCON6~BANKCON7
    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
@设置REFRESH,在S3C2440中11~17位是保留的,也即(Tchr<<16)无意义
    .word 0x32
@设置BANKSIZE,对于容量可以设置大写,多出来的空内存会被自动检测出来。没有搞明白突发模式操作是什么意思!
    .word 0x30
@设置MRSRB6
    .word 0x30
@设置MRSRB7
 
U-Boot完美解读(3)——时钟解读及代码转移 4、如何造就完美效率 4.1、话说效率 效率(efficiency)是指有用功率对驱动功率的比值,同时也引申出了多种含义。效率也分为很多种,比如机械效率(mechanical efficiency)、热效率(thermal efficiency )等。效率与做功的快慢没有直接关系。 对计算机领域而言,效率就是我们就最少的时间周期实现最大化的功能,比如说我们现在的处理器主频是2G的,那每条指令 阅读详情

相关推荐

uboot:源码分析-启动第一阶段-lowlevel_init

检查复位状态、IO恢复、关看门狗、开发板供电锁存、时钟初始化、DDR初始化、串口初始化并打印’O’、tzpc初始化、打印’K’。其中值得关注的:关看门狗、开发板供电锁存、时钟初始化、DDR初始化、打印"OK"

qq_43441284的博客 1549

lowlevel_init.S 分析

在我迷迷糊学看了lowlevel_init.S中的代码之后,有一个感觉就是,要想读懂其中的代码首先得看一下你所用的芯片手册,因为里面有比较详细的存储器控制(MemoryController)描述。我用的是s3c2440手册里写得十分清楚,总共有8个块(Banks)(Bank0~Bank7),每个块对应着不同的控制与地址线,其实这些Bank很大一部分是对应着的控制寄存器的地址,这个要看实际的芯片与板

逐波与逆流 881

uboot启动阶段分析三

这里继续 lowlevel_init 中的内容 这个函数是为了进行底层的一些初始化 lowlevel_init 预备环节 检查复位状态 lowlevel_init 中会对控制复位的寄存器中的值的16位和18位进行检测,判断当前处理器处于 DEEP-IDLE 还是 SLEEP 状态 对于不同的复位状态,有不同的处理方式 好比刚上电需要初始化 ddr,而从睡眠中唤醒可以直接使用 ddr IO 恢复...

greedyhao的博客 795

uboot启动流程(3)之lowlevel_init 函数详解

函数 lowlevel_init 在文件 arch/arm/cpu/armv7/lowlevel_init.S 中定义,内容如下: lowlevel_init.S 代码段 14 #include <asm-offsets.h> 15 #include <config.h> 16 #include <linux/linkage.h> 17 18 E...

qq_34591581的博客 2453

U-Boot源代码阅读笔记(二) —— 对lowlevel_init.S的分析

U-Boot源代码阅读笔记(二) —— 对lowlevel_init.S的分析本文主要分析与U-Boot启动过程相关的汇编代码lowlevel_init.S,目标平台以PXA270为例。文件位于board/myboard/lowlevel_init.S,主要执行内存相关的初始化 把链接寄存器LR(即R14)的值转存到寄存器R10中,以便lowlevel_init完成后恢复执行

sunrock的专栏 7558

EDEM在农业机械设计中的实战应用:以谷物收割机优化为例

本文以谷物收割机优化为例,详细阐述了EDEM离散元仿真软件在农业机械设计中的实战应用。通过构建精准的“数字谷物”模型与农机部件动态界面,利用GPU加速完成大规模颗粒系统仿真,有效诊断并解决了籽粒夹带损失与清选负荷不均等田间难题,实现了从仿真分析到田间验证的设计优化闭环。

weixin_29256771的博客 107

痞子衡嵌入式:深扒IAR启动函数流程及其__low_level_init设计对函数重定向的影响...

  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是IAR启动函数流程及其__low_level_init设计对函数重定向的影响。   上一篇文章 《IAR下RT-Thread工程自定义函数段重定向失效分析》 里我们找出了影响 IAR 链接器处理自定义程序段重定向的原因,主要跟 __low_level_init() 函数有关,这个函数属于 IAR 底层设计,它在 IAR 启动函...

痞子衡嵌入式 1293

matlab 图像合成_用MATLAB做图像合成加雾的处理

众所周知,现在有很多算法来对图像进行去雾处理。但反之,对图像增加雾的代码却少之又少,本代码就是基于Matlab实现了对图像的加雾处理。该方法可用做雾天图像的合成数据集。代码公开如下:clear;clc; % close all; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%i...

weixin_35719260的博客 2060

uboot启动——lowlevel_init函数详解

1

weixin_42031299的博客 1762

centos7安装Ambari 2.7.5 + HDP3.1.5

准备 1.安装包准备: Ambari2.7.5、HDP31.5、libtirpc-devel: centos7操作系统: 链接:https://pan.baidu.com/s/1vzvio5rAMsbYF0-0vBs5dw 提取码:xij9

kxq的博客 5091

从零开始:小鼠Bulk RNA-seq全流程实战指南

本文提供了一份详尽的小鼠Bulk RNA-seq全流程实战指南,涵盖从软件环境搭建、原始数据质控与清洗、序列比对、基因定量到下游差异表达分析与功能富集。内容面向生物信息学新手,通过清晰的代码示例和步骤解析,帮助读者系统掌握Bulk RNA-seq数据分析的核心技能,并产出可靠的生物学洞见。

lake5的博客 715

linux中uboot作用,[转]uboot中SPL作用

这篇文章写的非常详细[u-boot: 2014.01-rc1]u-boot SPL (second program loader), 对许多人来说也说很陌生。下面对此进行一个简单介绍。1. ARM SoC的启动过程:RomBoot --> SPL --> u-boot --> Linux kernel --> file system --> start applica...

weixin_42471893的博客 846

基于Simulink的双PMSM差速驱动转矩同步控制建模示例

本文详细介绍了基于Simulink的双永磁同步电机(PMSM)差速驱动转矩同步控制建模方法。针对AGV/叉车等双电机独立驱动系统的转矩不同步问题,提出主从式+交叉耦合控制策略,在Simulink中实现直线行驶、90°转弯和单轮打滑恢复三种工况的仿真验证。通过动力学建模、参数差异设置、同步误差定义及控制律设计,最终实现同步误差<3%、转弯半径跟踪误差<5%、打滑后100ms内恢复的性能指标。文章特别强调了实际工程中的参数标定、通信同步和故障处理要点,并提供了完整的Simulink建模步骤和工具箱使

xiaoheshang_123的博客 203

u-boot中SPL源代码分析

u-boot SPL源代码分析。 使用Atmel sama5d3xek做为例子进行分析。 源代码:https://github.com/voiceshen/u-boot/tree/sama5d3xek_spl_spi_nand

voice_shen的专栏 1万+

Python爬虫教程:爬取法院司法拍卖数据全流程实战(附反爬+数据分析方案)

Python爬虫爬取法院司法拍卖数据的核心是模拟真人行为规避反爬+精准解析页面数据+合理处理数据。新手不用一开始就追求高级的反爬技巧和复杂的数据分析,先把基础的分页爬取和数据保存功能跑通,再逐步优化。我做的这个工具现在每周帮朋友爬取全国10个城市的法拍房数据,自动生成分析报告,他说这让他的投资决策效率提升了一倍。如果你们在开发过程中遇到问题,比如反爬失败、数据解析错误,都可以在评论区留言,我会尽力解答。后续我还会出一期爬取京东司法拍卖数据的教程,帮助大家获取更多的法拍数据来源。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2177

API深度集成——OpenClaw与第三方服务无缝对接(2026实战版)

本文介绍了OpenClaw系统与第三方服务的API深度集成技术,重点阐述了RESTful API的实现方案。通过一个功能完善的REST客户端类(RestClient)展示了核心功能:支持请求重试、拦截器机制、错误处理和认证管理等;同时提供了API资源管理器(ApiResourceManager)简化资源操作。这些技术实现了OpenClaw与外部系统的稳定可靠对接,为开发者构建API集成方案提供了2026年的最佳实践。

博客 1214

uboot启动流程-涉及lowlevel_init汇编函数

uboot启动流程涉及函数lowlevel_init 函数

wojiaxiaohuang2014的博客 1466

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

深入浅析Linux下uboot之(六)-----------------------:uboot 启动的第一阶段之 lowlevel_init

lowlevel_init 里面实现了cpu 相关硬件初始化:检查复位状态、IO恢复、关看门狗、开发板供电锁存、时钟初始化、DDR初始化、串口初始化并打印'O'、tzpc初始化、打印'K'。lowlevel_init 函数真正的地方,是在uboot/board/samsumg/x210/lowlevel_init.S中。 目录 检查复位状态: IO 状态的恢复: 关看门狗: 供电锁存: ...

weixin_42432281的博客 819

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【嵌入式移植】9、U-Boot源码分析5—启动过程分析lowlevel_init

均未定义,因此115行和119行判断条件均不成立,程序直接跳转到132行开始运行,即。(Port A共有22个port,通过CFG0~3进行设置,这里。寄存器中,即设置堆栈栈顶指针指向内存中定义好的地址(寄存器值的低4位,即16字节对齐,并将结果保存在。的当前内容,即保留现场,保存子程序返回地址;,根据所用串口的索引号进行设置,这里通过查找可知。,在设置好堆栈,保存好子程序返回地址后,使用。这2个寄存器的内容,然后第43行使用。,定义了2个存有寄存器地址的结构体,中继续运行,即从图中115行开始运行。

TTZZWWW 1591

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

u-boot第一阶段start.s分析:lowlevel_init部分

u-boot一般分为两个阶段: 第一阶段:硬件相关初始化、初始化内存芯片为bootloader做好准备、复制bootloader到RAM空间中、设置好栈方便调用C语言、跳转到C代码入口。这个部分是汇编语言部分,只是为调用C语言做好准备。 第二阶段:初始化该阶段需要使用到的硬件设备、检测内存映射(MMU)、u-boot命令格式、为内核设置启动参数。这个部分就是C语言部分了。 以下是...

zi_yang的博客 746

uboot源码分析六 uboot启动流程三 lowlevel_init 函数 s_init 函数 _main 函数

lowlevel_init 函数 函数 lowlevel_init 在文件 arch/arm/cpu/armv7/lowlevel_init.S 中定义, /* * A lowlevel_init function that sets up the stack to call a C function to * perform further init. * * (C) Copyright...

monkea123的博客 2156

U-Boot源码——lowlevel_init.S

U-Boot-2011.12 的board/samsung/smdk2410/lowlevel_init.S内容如下: #include #include /* some parameters for the board */ /* * * Taken from linux/arch/arm/boot/compressed/head-s3c2410.S * * Copyrigh

OneSea 1157

uboot启动流程-lowlevel_init

1、源码及注释 ENTRY(lowlevel_init) /* * Setup a temporary stack. Global data is not available yet. */ ldr sp, =CONFIG_SYS_INIT_SP_ADDR bic sp, sp, #7 /* 8-byte alignment for ABI compliance */ #ifdef ...

嘉明的博客 1189

2 lowlevel_init.S

文章目录1 lowlevel_init2 设置栈指针 1 lowlevel_init   上一节说到在执行cpu_init_crit后,实际执行的是lowlevel_init,这段代码如下所示,位于 arch\arm\cpu\armv7\lowlevel_init.S 中。 .pushsection .text.lowlevel_init, "ax" WEAK(lowlevel_init) /* * Setup a temporary stack. Global data is not availab

夏夜晚风_的博客 608

2015.10uboot移植笔记 (三、低级初始化lowlevel_init)

上一篇,把start.S分析了一遍,这一篇只要分析lowlevel_init这个函数 这个函数有点长,采取分开分析,一点一点的看,不着急,哈哈哈 .globl lowlevel_init lowlevel_init: /* lr是连接寄存器(Link Register, LR),在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址二是当异常发生时, LR中保存的值等于异常发生...

酱油师兄的博客 2207
上一篇: uboot-的start.S详细注解及分析
下一篇: LDR R1,=0x12和LDR R1,0x12 ----之异同
jun2ran
博客等级 码龄19年 103粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值