wince7下SD host驱动学习笔记

主机控制器(host controller)、主机适配器(host adapter)或主机总线适配器(host bus adapter,HBA) AHCI是SATA原生的操作模式,Windows Vista开始的Windows已内置通用的Microsoft AHCI驱动程序。自1960年代以来使用不同的技术完成类似的目标:I/O通道,或者单纯的“通道”,它是一个单独的处理器,可以与CPU平行的独立地访问。但是,WWN更长(8字节)。一个HBA上有两种类型的WWN:节点WWN(WWNN)被主机总线适配器上的所有端口共享,端口WWN(WWPN)则是每个端口唯一。HBA的SAS接口可以连接SATA设备,反之SATA控制器的SATA接口不能连接SAS设备。 阅读详情

SD驱动框架:

        wince系统中sd驱动框架如下图所示,软件部分总体上可以分为3个层。最底层的是SD Host Controller Driver(sdhc.dll),这一层就是对硬件SD控制器直接操作的驱动层。在系统移植时,这一层驱动就需要根据实际处理器的SD控制器做修改。中间一层是SD Bus Driver(sdbus.dll),顾名思义是SD总线的驱动代码,负责SD HOST层和Client层之间的通信。它由微软实现,在系统移植时这一层一般不需要修改。最顶层为Client层,这一层会根据不同的设备来加载不同的驱动。如对于SD卡,这一层就会加载SD Memory(sdmemory.dll)。对于SD WiFi,这一层就会加载SDIO WiFi。

 

SD主控制器驱动(sdhc.dll):

        这一层驱动采用的是标准的流驱动接口,其接口实现在zc702的platform\zynq7000\src\drivers\sdhc\Sdhc.c文件中。在SDH_Init函数中调用SDHCDAllocateContext()函数来向SD总线层申请一个SD 上下文p_hc_context(实际是一个PSDCARD_HC_CONTEXT的结构体),然后通过SDHCDSetXXX将host 层的接口函数填入p_hc_context。最后通过SDHCDRegisterHostController()函数向SD总线层注册这个SD上下文。如下所示:

    // Register API functions

    SDHCDSetControllerInitHandler(p_hc_context,SDHInitialize);
    SDHCDSetControllerDeinitHandler(p_hc_context, SDHDeinitialize);
    SDHCDSetBusRequestHandler(p_hc_context,SDHBusRequestHandler);
    SDHCDSetCancelIOHandler(p_hc_context, SDHCancelIoHandler);
    SDHCDSetSlotOptionHandler(p_hc_context, SDHSlotOptionHandler);

    // Register ourself as a host controller

    status = SDHCDRegisterHostController(p_hc_context);

各接口函数的功能:

SDHInitialize:该函数主要是进行SD控制器的硬件初始化,注册系统中断,创建IST线程等。

SDHDeinitialize:这个函数执行与SDHInitialize相反的操作,注销系统中断,注销IST线程等。

SDHBusRequestHandler:这个函数处理SD总线传递下来的请求命令。处理完成后会调用SDHCDIndicateBusRequestComplete函数来通知总线层。

SDHCancelIoHandler:用于取消处于挂起状态的命令

SDHSlotOptionHandler:总线层调用这个函数并传入一些命令,这个函数再根据这些命令执行相应的处理函数来设置和获取SD底层的信息。这些命令及对应的含义如下所示:

SDHCDSetSlotPower:设置电压
SDHCDSetSlotInterface:设置时钟和总线宽度
SDHCDSetSlotPowerState:设置SD电源状态
SDHCDGetSlotPowerState:获取SD电源状态
SDHCDGetWriteProtectStatus:获取SD存储卡写保护状态
SDHCDQueryBlockCapability:获取HCD最大和最小块长度
SDHCDGetSlotInfo:获取SD控制器支持的总线宽度、电压范围、最大时钟速率等信息
SDHCDAckSDIOInterrupt:应答SDIO中断,清除中断标记位
一篇比较好的SD驱动文章: http://www.cnblogs.com/songtitan/archive/2007/02/11/647293.html

[转]wince 蓝牙 [转]wince 蓝牙 <br /> <br />上面是WinCE中蓝牙协议栈的架构图:<br /><br />      可以看到,HCI传输层以上的协议层全部由WinCE实现了,所以蓝牙模块只需要实现了基带层和链路管理层,并提供HCI传输接口给WinCE就可以了。WinCE支持使用USB、UART、SDIO等接口的蓝牙模块。<br />开发板上使用的是CSR-BC4-EXT-C2-PA蓝牙模块,模块接在串口0上。使用CSR的BCSP传输协议。以下是配置方法:<br />1 添加Bluetooth Sta 阅读详情

相关推荐

sd host controller spec

sd host controller spec

Win7系统USB3.0驱动解决方案

Win7系统USB3.0驱动解决方案 【下载地址】Win7系统USB3.0驱动解决方案 本项目提供了一款专为Windows 7系统设计的USB3.0驱动程序,旨在解决在VMware虚拟机中安装Windows 7后,U盘等移动设备无法被识别的问题。通过安装Intel(R) USB 3.0 eXtensible Host C...

gitblog_06789的博客 775

SD Host Controller Simplified Specification Version 3.00

SD Host Controller Simplified Specification Version 3.00 sdcard.org

四极管 SD card技术了解

【WinCE】SD card技术了解并WINCE下SDHC驱动开发(updated) 先记下,以后再研究。 原文地址:http://www.cnblogs.com/songtitan/archive/2007/02/11/647293.html SD Card Driver on ADS Summary 了解SD card. 1 WinCE 5.0下SD Stac

杨琦(四极管) 1747

数字IC设计——功耗分析

功耗是数字IC芯片的一个重要指标

知识,既贵,又便宜。 9364

告别盲调!用Synopsys VIP搭建PCIe 5.0验证环境,手把手搞定链路训练与均衡调试

本文详细介绍了基于Synopsys VIP搭建PCIe 5.0验证环境的实战指南,重点解析了链路训练(LTSSM)与均衡调试的关键技术。通过配置VIP组件、设计验证平台架构及实战调试技巧,帮助工程师高效解决PCIe 5.0验证中的常见问题,提升芯片验证效率与可靠性。

weixin_28700411的博客 459

Intel (R) 82801G (ICH7 Family) USB Universal Host Controller前面有感叹号

   症状:1、打印机不能正常打印,老是“脱机打印”,查看打印机首选项,文字都变成了?? 2、鼠标不能使用。  解决步骤: 1、怀疑是打印机驱动问题,更新驱动,不行。 2、下载笔记本主板驱动,重启,不行。 3、又下载不同版本驱动,重启还是不行。 4、装“驱动人生”,把有问题的USB驱动卸载,在重新启动驱动人生,自动到网上下载U

qingfengke78的专栏 1万+

通达信筹码分布主图源码分享

NOTEXT下区成本:IF(CURRBARSCOUNT<=CONST(XA_26+1),CONST(IF(1,XA_94,XA_94)),DRAWNULL),DOTLINE,COLORYELLOW;NOTEXT上区成本:IF(CURRBARSCOUNT<=CONST(XA_26+1),CONST(IF(1,XA_81,XA_81)),DRAWNULL),DOTLINE,COLORRED;FFG1:DRAWBAND(C线,RGB(255,0,0),XA_33,RGB(255,0,0));

zhibiaogong的博客 3358

SD-HOST Controller design-----SD CLK 设计

该模块最终输出两个时钟:一个为fifo_sd_clk,另一个为out_sd_clk_dft。当分频时候,div_counter开始计数,记到相应分频的时候,将hclk进行翻转,得到分频的时候给到fifo_sd_clk;当sd clk使能为低或者停时钟信号为高的时候,fifo_sd_clk为0。第二个为out_sd_clk_dft。当sd clk使能为低或者停时钟信号为高的时候,fifo_sd_clk为0。当不进入testmode时,分频系数为0 的时候为hclk,分频系数不为0的时候,则接分频后的时钟。

weixin_44297949的博客 441

Kylin-Desktop-V10-SP1-General-Release-2303-X86_64-海光版(hygon c86)安装与配置指南

本文提供了在国产海光C86处理器平台上安装与配置Kylin Desktop V10 SP1操作系统的详细指南。内容涵盖从下载专用镜像、制作启动盘、BIOS关键设置、磁盘分区方案,到系统安装后的驱动优化、必备软件安装及常见故障排除,旨在帮助用户顺利完成hygon c86平台的系统部署与优化。

tree的博客 1378

VxWorks系列 快速导航

Vxworks系列快速阅览导航

Mr.Sugarcane 1309

WinCE SD驱动分析

1.SD驱动架构<br /><br />如上图所示,WinCE下SD卡驱动协议栈组成 :<br />HOST硬件底层部分 (主控制端驱动)SDHC_XXX.DLL<br />BUS 中间逻辑命令层 (总线驱动)SDBUS.DLL<br />CLIENT上层(客户端驱动)SDMEMORY.DLL(1)主控制端驱动<br />主控制端驱动控制包含主控制器硬件,遵循主控制端驱动接口,它被用于总线驱动通信和设置操作参数。主控制器驱动接口提供一个硬件提取层,在总线和主控制端执行之间。即:SDHC_XXX.DLL是最底

左手技术 右手写诗 1114

【Matlab】刃边法计算mtf

摘要:刃边法是一种测量光学系统调制传输函数(MTF)的常用方法。本文介绍了基于Matlab的MTF计算实现方案,包括图像灰度化、梯度计算、刀口方向选择、梯度投影等关键步骤,并给出了完整的代码实现。该方案可通过添加图像预处理、多方向计算、函数封装等方式进行扩展,提高MTF计算的准确性和实用性,适用于不同应用场景的光学系统性能评估需求。(148字)

unber的博客 389

WinCE下SD卡驱动开发

转载自:http://www.cnblogs.com/nesta/archive/2008/05/30/967860.html  这个博客上的东东值得学习      WinCE 5.0下面SD卡驱动的开发。这是我做的第一个项目,当时做这个项目花费了相当的时间和精力,搞的我精疲力尽。几乎可以说当时对WinCE一点都不懂。也不知道从何处下手,就东看西看。东改西改,改的是一塌糊涂。幸好老板和老大

716

开源Harness项目DeerFlow 2.0,让智能体几乎能完成任何复杂任务

从提示工程到上下文工程,再到如今的 Harness,这条演进路径的本质是从“教模型如何理解人类”迈向“为模型构建一个可执行、可信赖、可长期运转的数字世界”。 当越来越多像 DeerFlow 2.0 这样的 Super Agent Harness 走向普及,AI 将真正进化为能理解、会规划、可执行、敢交付、长期负责的成熟生产力形态。

技术引领业务创新 520

Vivado ILA抓DDR信号(各种IO信号:差分、ISERDES、IOBUFDS等)

Vivado ILA抓DDR信号(各种IO信号:差分、ISERDES、IOBUFDS等)

千歌叹尽执夏的博客 1104

SD驱动问题及相关文章

     近来调了个SD卡驱动方面的问题,顺便看了一些文章,觉得不错,就拿来了,方便自己以后再看!   问题:在插拔卡时需要播放声音,但是卡在卡槽里时,休眠唤醒的时候也会发声音,开机的时候播放声音会卡   在handadddevice里处理<br />                if (fSameCard)<br />                 {<br /><br />                     delete psdDevice;<br />                 

csu_yang的专栏 2918

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

wince下SD卡驱动开发

WinCE 5.0下面SD卡驱动的开发。这是我做的第一个项目,当时做这个项目花费了相当的时间和精力,搞的我精疲力尽。几乎可以说当时对WinCE一点都不懂。也不知道从何处下手,就东看西看。东改西改,改的是一塌糊涂。幸好老板和老大都比较宽容,给了我充裕的时间和支持,将自己有关SD卡在WinCE 5。0下面的驱动理解的点滴给记录下来,希望能够对别人有所帮助。     目前WinCE下面的驱动主要有两种

zhubin0613的专栏 885

深度学习工具包 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")

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【WinCE】SD card技术了解并WINCE下SDHC驱动开发(updated)

SD Card Driver on ADS Summary 了解SD card. 1 WinCE 5.0下SD Stack. 6 Bus Driv

kkwant的博客 415

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WinCE 5.0下面SD卡驱动的开发(转)

WinCE 5.0下面SD卡驱动的开发。这是我做的第一个项目,当时做这个项目花费了相当的时间和精力,搞的我精疲力尽。几乎可以说当时对WinCE一点都不懂。也不知道从何处下手,就东看西看。东改西改,改的是一塌糊涂。幸好老板和老大都比较宽容,给了我充裕的时间和支持,将自己有关SD卡在WinCE 5。0下面的驱动理解的点滴给记录下来,希望能够对别人有所帮助。    目前WinCE下面的驱动主要有两种架构

jeanszu的专栏 1162

WindowsCE下面SD卡的驱动

WindowsCE下面SD卡的驱动 收藏 WinCE 5.0下面SD卡驱动的开发。这是我做的第一个项目,当时做这个项目花费了相当的时间和精力,搞的我精疲力尽。几乎可以说当时对WinCE一点都不懂。也不知道从何处下手,就东看西看。东改西改,改的是一塌糊涂。幸好老板和老大都比较宽容,给了我充裕的时间和支持,将自己有关SD卡在WinCE 5。0下面的驱动理解的点滴给记录下来,希望能够对别人有所帮助。  

C151151的专栏 1350

USB 3G驱动和USB HOST驱动加载

********************************LoongEmbedded********************************作者:LoongEmbedded(kandi)时间:2010.11.02类别:WINCE驱动开发********************************LoongEmbedded********************************USB 3G驱动和USB HOST驱动加载环境:WINCE6.0+S3C2443,USB HOST通过USB

LoongEmbedded的专栏 2990

详解WinCE下USB Host驱动开发

作者:我想说wince离我远点 转自:http://blog.csdn.net/lqxandroid2012/article/details/8649271 WinCE下所有的驱动都是以DLL的形式,被device.exe进程加载的,所以每个驱动程序中都要实现DllEntry函数。      在注册表的HKEY_LOCAL_MACHINE/Drivers/USB/LoadCl

老瓦的笔记本 600

WinCE SD模块结构

SD驱动采用微软的架构public自带就有,可看注册表中HKEY_LOCAL_MACHINE\Drivers\BuiltIn项下的host,bus项设置,检查HKEY_LOCAL_MACHINE\Drivers\Active下host,bus两层驱动. 逻辑上主要是: SDHC_xxx.dll是最底层,负责具体的发命令什么的, SDBus.dll是中间层,负责整合命令和管理,这两个在HK

cjwsimple 654
上一篇: u-boot中链接地址和加载地址的相关知识
下一篇: ARM Linux 3.x的设备树(Device Tree)
EmSoftEn
博客等级 码龄12年 40粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值