linux的板级支持以I.mx5为例 笔记版 转载请注明出处---crosskernel@gmail.com

ipu-examples:i.MX5和i.MX6系列的IPU示例代码 IPU示例 i.MX5和i.MX6系列的IPU示例代码 使用Yocto Project工具链进行交叉编译: 按照以下培训主题安装Yocto Project生成的SDK: 导出运行SDK环境设置的Yocto Project变量(请不要忘记“ source”命令)。工具链的版本将根据其版本进行更改。 它通常安装在/ opt / poky / ...... $ source /opt/poky/1.6+snapshot/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi 现在,使用configure和make进行构建。 $ ./configure --host = arm-none-linux-gnueabi --target = <目标> --prefix = <前缀> 在哪里: <目标>:mx5或mx6 <前缀>:i. 立即下载
1 对BOARD的抽象
Linux里用struct machine_desc来抽象板级支持。该结构描述了一个板子的基本硬件信息及函数。


struct machine_desc {
/*
* Note! The first four elements are used
* by assembler code in head.S, head-common.S
*/
//nr是板子的编号,每种类型的板子都有一个唯一的编号,内核根据bootloader送过来的板子编号来查其对应的struct machine_desc。
unsigned int nr; /* architecture number*/
unsigned int phys_io; /* start of physical io*/
unsigned int io_pg_offst; /* byte offset for io 
* page tabe entry*/


const char *name; /* architecture name*/
unsigned long boot_params; /* tagged list*/


unsigned int video_start; /* start of video RAM*/
unsigned int video_end; /* end of video RAM*/


unsigned int reserve_lp0 :1; /* never has lp0*/
unsigned int reserve_lp1 :1; /* never has lp1*/
unsigned int reserve_lp2 :1; /* never has lp2*/
unsigned int soft_reboot :1; /* soft reboot*/
void (*fixup)(struct machine_desc *,
struct tag *, char **,
struct meminfo *);
void (*map_io)(void);/* IO mapping function*/
void (*init_irq)(void);
struct sys_timer*timer; /* system tick timer*/
void (*init_machine)(void);
};


/*
 * Set of macros to define architecture features.  This is built into
 * a table by the linker.
 */
//内核提供了一个struct machine_desc的构造模板将该结构放入__section__(".arch.info.init"),所以内核对支持哪些board,那么一定会在内存:
__arch_info_begin = .;
*(.arch.info.init)
__arch_info_end = .;
里找到其对应的struct machine_desc。


#define MACHINE_START(_type,_name) \
static const struct machine_desc __mach_desc_##_type\
 __used \
 __attribute__((__section__(".arch.info.init"))) = {\
.nr = MACH_TYPE_##_type,\
.name = _name,


#define MACHINE_END \
};






//I.MX51的一个Babbage Board实现,对于MX51 Babbage Board,内核提供了
用来映射IO地址空间的函数mx5_map_io,用来初始化中断控制器的函数mx5_init_irq,用来注册外围设备函数mxc_board_init。而对于struct machine_desc没有能够覆盖到的处理函数,可以在fixup函数里处理。


MACHINE_START(MX51_BABBAGE, "Freescale MX51 Babbage Board")
/* Maintainer: Freescale Semiconductor, Inc. */
.fixup = fixup_mxc_board,
.map_io = mx5_map_io,
.init_irq = mx5_init_irq,
.init_machine = mxc_board_init,
.timer = &mxc_timer,
MACHINE_END








2 板级抽象结构的查找


arch/arm/kernel/head-common.S中




//从label 3开始的地方存放着struct machine_desc结构列表地址的地址


3: .long .
.long __arch_info_begin
.long __arch_info_end


__lookup_machine_type:
//把label 3的地址放入r3
adr r3, 3b
//r5放入起始地址,r6放入结束地址
ldmia r3, {r4, r5, r6}
sub r3, r3, r4@ get offset between virt&phys
add r5, r5, r3@ convert virt addresses to
add r6, r6, r3@ physical address space
//顺着struct machine_desc结构列表地址逐个查找ID匹配r1的结构
1: ldr r3, [r5, #MACHINFO_TYPE] @ get machine type
teq r3, r1@ matches loader number?
beq 2f@ found
add r5, r5, #SIZEOF_MACHINE_DESC@ next machine_desc
cmp r5, r6
blo 1b
mov r5, #0@ unknown machine
2: mov pc, lr 
//如果找到了r5里存放着着struct machine_desc结构地址,否则为0.
ENDPROC(__lookup_machine_type)


/*
 * This provides a C-API version of the above function.
 */
ENTRY(lookup_machine_type)
stmfd sp!, {r4 - r6, lr}
//r0里是板子的ID号,将其放到r1中
mov r1, r0
bl __lookup_machine_type
//作为返回结果,把r5放入r0
mov r0, r5
ldmfd sp!, {r4 - r6, pc}
ENDPROC(lookup_machine_type)
飞思卡尔i.mx53x CPU对比 飞思卡尔i.mx53x CPU对比,包括内部各参数比较,及开发板介绍 立即下载

相关推荐

2026年4月AI爆发周:阿里连推三款模型、字节全双工语音上线,国内大模型进入“落地竞速“新阶段

**摘要:**2026年4月初,国内AI大模型迎来密集发布,阿里、字节、腾讯分别推出新产品。阿里一周发布三款模型,覆盖通用推理、多模态轻量化和长文档处理,API价格大幅下降;字节推出全双工语音模型,实现实时交互,技术难度高;腾讯混元3.0强调工程化和生态整合,面向企业私有化部署。趋势显示,行业从性能竞赛转向落地竞赛,多模态成为主战场,API成本降低,开发者选择更丰富。国内大模型竞争重点转向实际应用和生态整合。

weixin_45526015的博客 1万+

i.MX537多媒体应用处理器简介

概述         i.MX53系列处理器代表飞思卡尔下一代基于ARM Cortex™-A8内核的先进多媒体和节能技术。i.MX537内核速率为800 MHz,其理想的性能和功耗可满足高端高级应用的严苛要求。i.MX537处理器含有集成显示控制器、1080p HD视频解码和720p视频编码、增强型图形和连接功能,适用于各种应用,如人机接口(HMI)以及需要深色显示和用户交互功能丰富用户界面的患

Jacklinmiao的专栏 1478

Spring Boot日志可视化实战:5分钟搞定Promtail采集与Grafana查询(避坑指南)

本文详细介绍了如何通过Promtail和Grafana实现Spring Boot日志的可视化查询,提供从日志采集到高效查询的全流程实战指南,重点解决部署中的常见问题。内容包括Logback配置、Promtail日志采集、Grafana的LogQL查询技巧及生产环境优化建议,帮助开发者快速定位和解决日志问题。

weixin_42526015的博客 107

linux板级描述文件

linux2.6 板级描述文件 此时还没有设备树

weixin_41903639的博客 615

量化交易——量化选股(多因子选股)

就是用过去的股票的收益率对多因子进行回归,得到一个回归方程,然后再把最新的因子值代入回归方程得到一个对未来股票收益的预判,然后再以此为依据进行选股。的方法是建立在市场无效或弱有效的前提之下,随着使用多因子选股模型的投资者数量的不断增加,有的因子会逐渐失效,而。就是根据各个因子的大小对股票进行打分,然后按照一定的权重加权得到一个总分,根据总分再对股票进行筛选。另一方面,一些因子可能在过去的市场环境下比较有效,而随着市场风格的改变,这些。波动的影响,避免在市场极度狂热或悲观的情况下作出非理性的。

jiucaixiuyang的博客 1792

【ISP图像处理】Demosaic去马赛克技术演进与边缘优化策略

本文深入解析了ISP图像处理中的Demosaic(去马赛克)技术。从Bayer阵列原理出发,梳理了从双线性插值、Hamilton-Adams边缘导向算法到利用通道相关性与自相似性的技术演进历程,并重点探讨了针对边缘与纹理伪影的优化策略,为工程实践中的算法选型与硬件协同设计提供了专业指导。

weixin_29091445的博客 389

2440 linux内核移植-板级模板创建

通过前面的UBOOT的移植,我们已经了解到移植的基本流程,在安装好交叉编译环境之后,建立linux的sourceinsight工程,方便修改,可以开始移植调试LINUX(版本2.6.32.2)内核了。 LINUX操作系统的伟大之处这里就不再废话了。内核移植最让人头痛的往往是寻找相关设备驱动。由于不同的板子上所配置的硬件都有区别,如何精确的加载所需要的驱动模块且去掉不需要的部分是个劳神费力的事

fz835304205的专栏 1207

使用fluent计算流噪声_Fluent能够做的事

刚接触到fluent的同学们,应该会比较好奇,fluent能够做些什么事情,和你的研究有没有关联,能不能达到你的目的?如果不弄明白这样一点,前期可能会做很多无用功。 fluent是计算流体力学的软件,是一个工具。这样一个工具发展至今,可以用来模拟的绝不只有流体力学。下面我们依次来说明。首先是流动,fluent提供了非常丰富的流动模型,不仅可以模拟层流,同样还可以模拟...

weixin_28717647的博客 4858

板级文件中的struct resource结构体

linux对挂接在4G总线空间上的设备实体的管理方式 -- struct resource /usr/src/linux-2.6.21.5/include/linux/ioport.h struct resource {     resource_size_t start;     resource_size_t end;     const char      *name;

K_Linux_ManのBlog 3659

基于STM32的智能火灾报警系统设计:多传感器融合与远程控制实现

本文详细介绍基于STM32单片机的智能火灾报警系统设计,采用多传感器融合技术(烟雾、温度、火焰检测)实现高精度火灾识别。系统集成远程控制与手机APP监控,通过加权决策算法降低误报率,提供多级响应策略,确保火灾预警的准确性与可靠性。

u5v6w7的博客 1104

【Matlab】如何使用Simulink进行电池建模和SOC预估

“通过Simulink电池建模进行SOC预估,其实挺容易!” 1 声明 本文只描述一般性电池建模方法,文中出现的电池相关数据来自一些论文或者外文文献,对数据的真实性不做任何保证。 本文参考了不少国内高校的硕士论文和外文文献,所以本篇文章只作为学术性交流,未经...

wanff1204的博客 2万+

linux板级初始化

linux板级初始化 2017-07-26 开发板:IMAX6Q 内核:3.0.35   最近拿到了明远智睿 的EK314开发板,以前主要用2440,眼界过于狭隘,借此机会练习下。 首先看看它的板级文件 /arch/arm/mach-mx6/board-myimx6ek314.c 在他的末尾指定了map_io、init_irq、init_machine、timer等初始化函数,M

行善之人必有余庆 404

怀旧版电脑GBC模拟器

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

linux 为开发板添加板级文件config.h

新的板子 需要在之前的板子基础上 做一些改动 首先就是要配置自己的板级文件 参考陈富林博客 这个写的很详细 https://www.cnblogs.com/chenfulin5/p/6393415.html?tdsourcetag=s_pcqq_aiomsg 最后 指定把dts设备树加载到对应地址空间 指定的地址,同时也是kernel加载设备树的地...

weixin_30561425的博客 373

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

linux 板级文件信息的注册流程

1.bluetooth资源结构体 static struct mt6622_platform_data mt6622_platdata = {     .power_gpio         = { // BT_REG_ON         .io             = RK30_PIN3_PC7, // set io to INVALID_GPIO for disable it

tianqingtz的专栏 2348

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

kernel 3.2.0 上加入自己的板级文件

第一步、复制自己的参考的板级文件 cp arch/arm/mach-omap2/board-am335xevm.c arch/arm/mach-omap2/board-aplex_ECM_5412.c 第二步、在对应的kconfig ,Makefile 里面增加对应的代码 // vim arch/arm/mach-omap2/Makefile // 这是原...

weixin_34309543的博客 279

全面解析Linux 内核 3.10.x - 板级初始化 - setup_arch

From: 全面解析Linux 内核 3.10.x - 本文章完全基于MIPS架构 九层之台,起于垒土 千里之行,始于足下 - 老子从dmesg的第一条打印信息说起 - Linux banner且看我的ubuntu 12.04的第一条打印语句Linux version 3.11.0-15-generic (buildd@allspice) (gcc version 4.6.3 (Ubuntu/ Li

何文的专栏 1万+

Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)

转载:http://blog.chinaunix.net/uid-20543672-id-3067021.html Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)     在移植内核的时候,通常会遇到引脚复用(MUX)的配置问题。在现在的Linux内核中,对于TI的ARM芯片,早已经有了比较通用的MUX配置框架。这对于许多TI的芯片都是通用的,这次

dongshengzou95的专栏 1970

Linux driver 板级文件跟踪一般方法

/*********************************************************************************** * Linux driver 板级文件跟踪一般方法 * 声明: * 1. 这是本人使用vim+ctags最常用的跟踪方法,也是唯一的方法; :) * ...

weixin_34168700的博客 231

linux x86板级文件,linux板级包安装配置

编译库注意一下几方面:(1)./configure --help 命令查看编译的库所依赖的库,里面--without-pango表示默认将pang编译进去,通过--without-可以不用编译进去。(2)./configure --prefix=指定生成文件路径 CFLAGS=-I指定库文件的头文件路径 LDFLAGS=-L指定库文件路径 --host=arm-linux指定编译器 ...

weixin_27037521的博客 323

linux 板级文件结构图,开发笔记(一)Kintex - 7 板级资源简介以及说明

一。 概述.笔者有幸接到了XIlinx Kintex-7 的开发板:如下所示: 注:拨码开关拨到上图所示的位置(原因请往下看)。二。资源概述fpga 型号:Kintex-7 XC7K325T-2FFG900C FPGA1GB DDR3128Mb BPI :需要利用FPGA中所创建的MicroBlaze或PicoBlaze内核并运行该内核(引擎),然后通过Xilinx的Cable-Ⅲ(JTAG)C...

weixin_30853033的博客 771

嵌入式Linux系统:基础知识_板级支持包BSP

1、BSP概述 BSP即Board Support Package,板级支持包。它来源于嵌入式操作系统与硬件无关的设计思想,操作系统被设计为运行在虚拟的硬件平台上。对于具体的硬件平台,与硬件相关的代码都被封装在BSP中,由BSP向上提供虚拟的硬件平台,BSP与操作系统通过定义好的接口进行交互。BSP是所有与硬件相关的代码体的集合。 一个成熟的商用操作系统,其...

santirenpc的博客 2139
上一篇: SMP多核处理器omap4启动分析 笔记版 转载请注明出处---crosskernel@gmail.com
下一篇: android手机高精度定时机制--higher timer tick 笔记版 转载请注明出处--- crosskernel@gmail.com
crosskernel
博客等级 码龄18年 14粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值