linux 编译3g驱动_Linux -> 嵌入式Linux下3G模块的驱动和应用

嵌入式Linux下3G模块的驱动和应用

1、 开发资源

1.1、硬件资源:

ZTE-mf637u(中国联通)

ZTE-mu351(中国移动)

1.2、软件资源:

1.2.1、usb-modeswitch-1.1.3

libusb-0.1.12.tar.gz

usb-modeswitch-1.1.3.tar.bz2

1.2.2、ppp-2.4.4

libpcap-0.9.8.tar.gz

ppp-2.4.4.tar.gz

1.2.3、wvdial

1.2.3.1、wvdial-1.54.0(arm-linux-gcc 3.4.1)

zlib-1.2.5.tar.bz2

openssl-0.9.7g.tar.gz

openssl-0.9.7g-fix_manpages-1.patch

wvstreams-4.0.1.tar.bz2

wvstreams-4.0.1-tcl84-1.patch

wvdial-1.54.0.tar.gz

1.2.3.2、wvdial_1.60.4(arm-linux-gcc 4.2.2)

zlib-1.2.5.tar.bz2

openssl-0.9.8n.tar.gz

openssl-0.9.8n-fix_manpages-1.patch

wvstreams-4.6.1.tar.gz

wvdial_1.60.4.tar.gz

2、 Linux开发环境

2.1、主机环境

2.1.1、主机linux系统

Fedora Core 6

2.1.2、主机编译环境

2.1.2.1、gcc -v

Using built-in specs.

Target: i386-redhat-linux

Configured with: ../configure --prefix=/usr

--mandir=/usr/share/man --infodir=/usr/share/info --enable-shared

--enable-threads=posix --enable-checking=release --with-system-zlib

--enable-__cxa_atexit --disable-libunwind-exceptions

--enable-libgcj-multifile

--enable-languages=c,c++,objc,obj-c++,java,fortran,ada

--enable-java-awt=gtk --disable-dssi --enable-plugin

--with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre

--with-cpu=generic --host=i386-redhat-linux

Thread model: posix

gcc version 4.1.1 20061011 (Red Hat 4.1.1-30)

2.1.2.2、/usr/local/arm/3.4.1/bin/arm-linux-gcc -v

Reading specs from

/usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/specs

Configured with:

/work/crosstool-0.27/build/arm-linux/gcc-3.4.1-glibc-2.3.2/gcc-3.4.1/configure

--target=arm-linux --host=i686-host_pc-linux-gnu

--prefix=/usr/local/arm/3.4.1

--with-headers=/usr/local/arm/3.4.1/arm-linux/include

--with-local-prefix=/usr/local/arm/3.4.1/arm-linux --disable-nls

--enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit

--enable-languages=c,c++ --enable-shared --enable-c99

--enable-long-long

Thread model: posix

gcc version 3.4.1

2.1.2.3、/usr/local/arm/4.2.2/usr/bin/arm-linux-gcc -v

Using built-in specs.

Target: arm-unknown-linux-gnueabi

Configured with:

/home/scsuh/workplace/coffee/buildroot-20071011/toolchain_build_arm/gcc-4.2.2/configure

--prefix=/usr --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu

--target=arm-unknown-linux-gnueabi --enable-languages=c,c++

--with-sysroot=/usr/local/arm/4.2.2-eabi/

--with-build-time-tools=/usr/local/arm/4.2.2-eabi//usr/arm-unknown-linux-gnueabi/bin

--disable-__cxa_atexit --enable-target-optspace --with-gnu-ld

--enable-shared --with-gmp=/usr/local/arm/4.2.2-eabi//gmp

--with-mpfr=/usr/local/arm/4.2.2-eabi//mpfr --disable-nls

--enable-threads --disable-multilib --disable-largefile

--with-arch=armv4t --with-float=soft

--enable-cxx-flags=-msoft-float

Thread model: posix

gcc version 4.2.2

2.2、开发板环境

2.2.1、CES-6410开发平台

Samsung S3C6410X, ARM1176JZF-S

128MB, Mobile DDR SDRAM

USB HOST:一个USB HOST 接口,USB2.0全速(12Mbits/s)

3、 Linux应用软件的编译

3.1、usb-modeswitch-1.1.3

[root@localhost cdma]# tar xzf libusb-0.1.12.tar.gz

[root@localhost cdma]# cp libusb-0.1.12 libusb-0.1.12-arm

[root@localhost cdma]# cd libusb-0.1.12-arm

[root@localhost libusb-0.1.12-arm]#./configure

--prefix=/works/cdma/install --host=arm-linux CC=arm-linux-gcc

CXX=arm-linux-g++

[root@localhost libusb-0.1.12-arm]# make

[root@localhost libusb-0.1.12-arm]# make install

[root@localhost libusb-0.1.12-arm]# cd ..

[root@localhost cdma]# tar xjf usb-modeswitch-1.1.3.tar.bz2

[root@localhost cdma]# cp usb-modeswitch-1.1.3

usb-modeswitch-1.1.3-arm

[root@localhost cdma]# cd usb-modeswitch-1.1.3-arm

[root@localhost usb-modeswitch-1.1.3-arm]#

修改Makefile

CC = gcc

改为

CC = arm-linux-gcc

CFLAGS += -Wall -l usb

改为

CFLAGS += -Wall -l usb -I/works/cdma/install/include

-L/works/cdma/install/lib

修改usb_modeswitch.c

// readConfigFile("/etc/usb_modeswitch.setup");

改为

readConfigFile("/etc/usb_modeswitch.setup");

[root@localhost usb-modeswitch-1.1.3-arm]# make

[root@localhost usb-modeswitch-1.1.3-arm]# make install

[root@localhost usb-modeswitch-1.1.3-arm]# cd ..

[root@localhost cdma]#

3.2、ppp-2.4.4

[root@localhost cdma]# tar xzf libpcap-0.9.8.tar.gz

[root@localhost cdma]# cp libpcap-0.9.8 libpcap-0.9.8-arm

[root@localhost libpcap-0.9.8-arm]# ./configure

--prefix=/works/cdma/install --host=arm-linux --with-pcap

make: *** No rule to make target `pcap-yes.o', needed by

`libpcap.a'. Stop.

修改Makefile

PSRC = pcap-yes.c

改为

PSRC = pcap-linux.c

[root@localhost libpcap-0.9.8-arm]# make

[root@localhost libpcap-0.9.8-arm]# make install

[root@localhost libpcap-0.9.8-arm]# cd ..

[root@localhost cdma]# tar xzvf

ppp-2.4.4.tar.gz

[root@localhost cdma]# cd ppp-2.4.4

[root@localhost ppp-2.4.4]# ./configure --host=arm-linux

vi pppd/Makefile

LIBS += -lpcap

CFLAGS += -DPPP_FILTER

改为

LIBS += -lpcap -L../../libpcap-0.9.8

CFLAGS += -DPPP_FILTER -I../../libpcap-0.9.8

[root@localhost ppp-2.4.4]# make CC=arm-linux-gcc

3.3、wvdial

3.3.1、wvdial-1.54.0

[root@localhost wvdial-1.54.0]# export

PATH=/usr/local/arm/3.4.1/bin:$PATH

[root@localhost wvdial-1.54.0]# tar xjf zlib-1.2.5.tar.bz2

[root@localhost wvdial-1.54.0]# cd zlib-1.2.5

[root@localhost zlib-1.2.5]#./configure

--prefix=/works/wvdial-1.54.0/install

修改Makefile

CC = arm-linux-gcc

CPP=arm-linux-gcc -E

AR=arm-linux-ar rc

RANLIB=arm-linux-ranlib

[root@localhost zlib-1.2.5]# make

[root@localhost zlib-1.2.5]# make install

[root@localhost wvdial-1.54.0]# tar xzf

openssl-0.9.7g.tar.gz

[root@localhost wvdial-1.54.0]# cd openssl-0.9.7g

[root@localhost openssl-0.9.7g]# patch -Np1 -i

../openssl-0.9.7g-fix_manpages-1.patch

[root@localhost openssl-0.9.7g]#./Configure

--prefix=/works/wvdial-1.54.0/install os/compiler:arm-linux-gcc

[root@localhost openssl-0.9.7g]# make

[root@localhost openssl-0.9.7g]# make install

[root@localhost openssl-0.9.7g]# cd ..

[root@localhost wvdial-1.54.0]# tar xjf

wvstreams-4.0.1.tar.bz2

[root@localhost wvdial-1.54.0]# cd wvstreams-4.0.1

[root@localhost wvstreams-4.0.1]# patch -Np1 -i

../wvstreams-4.0.1-tcl84-1.patch

修改configure

with_openssl=no

改为

with_openssl=yes

(有两处)

[root@localhost wvstreams-4.0.1]# ./configure

--prefix=/works/wvdial-1.54.0/install --host=arm-linux

CFLAGS=-I/works/cdma/install/include

LDFLAGS=-L/works/cdma/install/lib/

--with-zlib=/works/cdma/zlib-1.2.5

--with-openssl=/works/cdma/openssl-0.9.8n --without-dbus

--with-pam=no --with-tcl=no --with-qt=no

[root@localhost wvstreams-4.0.1]# make

linking libwvutils.so...

/usr/lib/libz.so: could not read symbols: Invalid operation

collect2: ld returned 1 exit status

make: *** [libwvutils.so] Error 1

[root@localhost wvstreams-4.0.1]# arm-linux-gcc -L./xplc

-L/works/cdma/install/lib/ -L./xplc -L. -g

-Wl,-soname,libwvutils.so.4.0 -shared -o libwvutils.so

utils/strcrypt.o utils/verstring.o utils/wvaudioencoder.o

utils/wvbase64.o utils/wvbdbhash.o utils/wvcrash.o

utils/wvdiriter.o utils/wvgzip.o utils/wvhashtable.o utils/wvhex.o

utils/wvmagiccircle.o utils/wvmatrix.o utils/wvqdbmhash.o

utils/wvrateadjust.o utils/wvserialize.o utils/wvshmzone.o

utils/wvstringtable.o utils/wvsubproc.o utils/wvtest.o

utils/wvwordwrap.o libwvbase.so -lsupc++ -lgcc_eh

[root@localhost wvstreams-4.0.1]# make

[root@localhost wvstreams-4.0.1]# vi wvrules.mk

XX_LIBS := $(XX_LIBS) $(shell $(CC) -lsupc++ -lgcc_eh

2>&1 | grep -q "undefined reference"

&& echo " -lsupc++ -lgcc_eh")

改为

XX_LIBS := $(XX_LIBS) $(shell $(CC) -lsupc++ -lgcc_eh

2>&1 | grep -q "undefined reference"

&& echo " -lz -lcrypt -lsupc++

-lgcc_eh")

[root@localhost wvstreams-4.0.1]# make

compiling crypto/wvtripledes.o...

crypto/wvtripledes.cc: In member function `virtual bool

WvTripleDESEncoder::_encode(WvBuf&,

WvBuf&, bool)':

crypto/wvtripledes.cc:108: error: cannot convert `const unsigned

char*' to `

unsigned char (*)[8]' for argument `1' to `void

DES_ecb3_encrypt(unsigned

char (*)[8], unsigned char (*)[8], DES_key_schedule*,

DES_key_schedule*,

DES_key_schedule*, int)'

make: *** [crypto/wvtripledes.o] Error 1

解决方法:

crypto/wvtripledes.cc

修改

#if OPENSSL_VERSION_NUMBER >= 0x0090705FL

改为

#if 0

compiling crypto/wvx509.o...

crypto/wvx509.cc: In member function `WvString

WvX509Mgr::get_extension(int)':

crypto/wvx509.cc:1168: error: invalid conversion from `unsigned

char**' to `

const unsigned char**'

crypto/wvx509.cc:1171: error: invalid conversion from `unsigned

char**' to `

const unsigned char**'

make: *** [crypto/wvx509.o] Error 1

解决方法:

crypto/wvx509.cc

if (method->it)

ext_data = ASN1_item_d2i(NULL,

&ext->value->data,

ext->value->length,

ASN1_ITEM_ptr(method->it));

else

ext_data = method->d2i(NULL,

&ext->value->data,

ext->value->length);

改为

if (method->it)

ext_data = ASN1_item_d2i(NULL, (const unsigned char

**)&ext->value->data,

ext->value->length,

ASN1_ITEM_ptr(method->it));

else

ext_data = method->d2i(NULL, (const unsigned char

**)&ext->value->data,

ext->value->length);

compiling streams/wvpam.o...

streams/wvpam.cc: In member function `bool

WvPam::authenticate(const

WvFastString&, const

WvFastString&, const

WvFastString&)':

streams/wvpam.cc:71: error: `fail' undeclared (first use this

function)

streams/wvpam.cc:71: error: (Each undeclared identifier is

reported only once

for each function it appears in.)

make: *** [streams/wvpam.o] Error 1

解决方法:

return fail;

改为

return false;

[root@localhost wvstreams-4.0.1]# make install

[root@localhost wvstreams-4.0.1]# cp libwvutils.so

../install/lib/libwvutils.so.4.0 -a

[root@localhost wvstreams-4.0.1]# cd ..

[root@localhost wvdial-1.54.0]# tar xzf wvdial-1.54.0.tar.gz

[root@localhost wvdial-1.54.0]# cd wvdial-1.54.0

[root@localhost wvdial-1.54.0]# cp

/works/wvdial-1.54.0/install/include/wvstreams/*.h .

[root@localhost wvdial-1.54.0]# vi Makefile

PREFIX=/usr/local

改为

PREFIX=/works/wvdial-1.54.0/install

PPPDIR=/etc/ppp/peers

改为

PPPDIR=${PREFIX}/etc/ppp/peers

XPATH=.. ../wvstreams/include $(PKGINC)

改为

XPATH=/works/wvdial-1.54.0/install/include/wvstreams

LIBS += -L../wvstreams -lwvutils -lwvstreams

改为

LIBS += -L/works/wvdial-1.54.0/install/lib -lwvutils -lwvstreams

-lwvbase -lz

[root@localhost wvdial-1.54.0]# vi wvrules.mk

增加

CC = arm-linux-g++

CXX = arm-linux-g++

[root@localhost wvdial-1.54.0]# make

[root@localhost wvdial-1.54.0]# make install

3.3.2、wvdial-1.60.4

export PATH=/usr/local/arm/4.2.2-eabi/usr/bin:$PATH

tar xjf zlib-1.2.5.tar.bz2

cd zlib-1.2.5

./configure --prefix=/works/cdma/install-4.2.2

修改Makefile

CC = arm-linux-gcc

CPP=arm-linux-gcc -E

AR=arm-linux-ar rc

RANLIB=arm-linux-ranlib

make

make install

openssl-0.9.8n

patch -Np1 -i ../openssl-0.9.8n-fix_manpages-1.patch

./Configure --prefix=/works/cdma/install-4.2.2

os/compiler:arm-linux-gcc

make

make install

wvstreams-4.6.1

修改configure

with_zlib=no

改为

with_zlib=yes

(有两处)

with_openssl=no

改为

with_openssl=yes

(有两处)

./configure --prefix=/works/cdma/install-4.2.2 --host=arm-linux

CPPFLAGS=-I/works/cdma/install-4.2.2/include

LDFLAGS=-L/works/cdma/zlib-1.2.5-4.2.2

CFLAGS=-I/works/cdma/zlib-1.2.5-4.2.2

--with-zlib=/works/cdma/zlib-1.2.5-4.2.2/

--with-openssl=/works/cdma/openssl-0.9.8n-4.2.2 --without-dbus

--with-pam=no --with-tcl=no --with-qt=no --without-valgrind

make

make install

wvdial-1.60.4

修改Makefile

prefix=/usr/local

改为

prefix=/works/cdma/install-4.2.2

PPPDIR=/etc/ppp/peers

改为

PPPDIR=${prefix}/etc/ppp/peers

PC_CFLAGS=$(shell pkg-config --cflags libwvstreams)

改为

PC_CFLAGS=-I/works/cdma/install-4.2.2/include/wvstreams

PC_LIBS=$(shell pkg-config --libs libwvstreams)

PC_LIBS=-L/works/cdma/install-4.2.2/lib -lwvstreams -lwvutils

-lwvbase

修改wvrules.mk

WVLINK_CC = gcc

改为

WVLINK_CC = arm-linux-g++

CC = arm-linux-g++

CXX = arm-linux-g++

make

make install

4、 Linux内核的配置与修改

4.1、linux内核配置

make menuconfig

Device Drivers --->

[*] Network device support --->

PPP (point-to-point protocol)

support

[*] PPP multilink support (EXPERIMENTAL)

[*] PPP filtering

PPP support for async serial

ports

PPP support for sync tty

ports

PPP Deflate compression

PPP MPPE compression

(encryption) (EXPERIMENTAL)

PPP over Ethernet

(EXPERIMENTAL)

[*] USB support --->

USB Modem (CDC ACM)

support

USB Serial Converter support --->

USB driver for GSM and CDMA

modems

4.2、linux内核修改

drivers/usb/serial/option.c

static struct usb_device_id option_ids[] = {

};

在这个数组中添加两项

{ USB_DEVICE(0x19d2, 0x0031) },

{ USB_DEVICE(0x19d2, 0x0034) },

4.3、linux内核编译

make zImage

make modules

5、 3G模块的使用

5.1、加载内核模块

insmod option.ko

insmod cdc-acm.ko

insmod slhc.ko

insmod ppp_generic.ko

insmod pppox.ko

insmod pppoe.ko

insmod ppp_synctty.ko

insmod ppp_deflate.ko

insmod crc-ccitt.ko

insmod ppp_async.ko

insmod sha1_generic.ko

insmod ppp_mppe.ko

5.2、加载USB文件系统

mount -t usbfs usbfs /proc/bus/usb

5.3、ZTE-mf637u(中国联通)的使用

5.3.1、配置文件/etc/usb_modeswitch.setup

# Configuration for the usb-modeswitch package, a mode switching

tool for

# USB devices providing multiple states or modes

#

# This file is evaluated by the wrapper script "usb_modeswitch"

in /lib/udev

# To enable an option, set it to "1", "yes" or "true" (case

doesn't matter)

# Everything else counts as "disable"

# Disable automatic mode switching globally (e.g. to access the

original

# install storage)

DisableSwitching=0

# Enable logging (results in a extensive report file in

/var/log, named

#

"usb_modeswitch_"

EnableLogging=0

########################################################

# ZTE MF622 (aka "Onda MDC502HS")

# ZTE MF626

# ZTE MF628+ (tested version from Telia / Sweden)

# ZTE MF633

# ZTE MF636 (aka "Telstra / BigPond 7.2 Mobile Card")

# ZTE MF637

#

# Contributor: Joakim Wennergren and others

DefaultVendor= 0x19d2

DefaultProduct= 0x2000

TargetVendor= 0x19d2

TargetProduct= 0x0031

MessageContent="5553424312345678000000000000061b000000020000000000000000000000"

MessageContent2="5553424312345678000000000000061b000000030000000000000000000000"

NeedResponse=1

5.3.2、配置文件/etc/wvdial.conf

[Dialer Defaults]

Modem = /dev/ttyUSB2

Init1 = ATZ

Init3 = ATE0V1

Init5 = ATS0=0

Init6 = AT+CGDCONT=1,"IP","uninet"

Init7 = AT+CFUN=1

Modem Type = USB Modem

Baud = 460800

New PPPD = yes

ISDN = 0

Phone = *99***1#

Password = any

Username = any

Stupid Mode = 1

5.3.3 ZTE-mf637u(中国联通)的操作步骤

5.3.3.1、设置环境变量

export PATH= /works/wvdial-1.54.0/install/bin:

/works/cdma/install/bin :$PATH

export LD_LIBRARY_PATH= /works/wvdial-1.54.0/install/lib:

/works/cdma/install/lib:$LD_LIBRARY_PATH

5.3.3.2、插入ZTE-mf637u(中国联通)无线网卡

5.3.3.3、等待5秒钟左右、运行usb-modeswitch -W

5.3.3.4、运行wvdial

--> WvDial: Internet dialer version 1.54.0

--> Cannot open /dev/ttyUSB2: Cannot get

information for serial port.

--> Cannot open /dev/ttyUSB2: Cannot get

information for serial port.

--> Cannot open /dev/ttyUSB2: Cannot get

information for serial port.

解决:(两种方法)

5.3.3.4.1将wvstreams-4.0.1/streams/wvmodem.cc

#if HAVE_LINUX_SERIAL_H

改为

#if 0

5.3.3.4.2.

wvstreams-4.0.1的配置命令增加ac_cv_header_linux_serial_h=no

即./configure --prefix=/works/wvdial-1.54.0/install

--host=arm-linux CFLAGS=-I/works/cdma/install/include

LDFLAGS=-L/works/cdma/install/lib/

--with-zlib=/works/cdma/zlib-1.2.5

--with-openssl=/works/cdma/openssl-0.9.8n --without-dbus

--with-pam=no --with-tcl=no --with-qt=no

ac_cv_header_linux_serial_h=no

重新编译。

5.4、ZTE-mu351(中国移动)的使用

5.4.1、配置文件/etc/wvdial.conf

Modem = /dev/ttyACM2

Init1 = ATZ

Init3 = ATE0V1

Init5 = ATS0=0

Init6 = AT+CGDCONT=1,"IP","cmnet"

Init7 = AT+CFUN=1

Modem Type = USB Modem

Baud = 460800

New PPPD = yes

ISDN = 0

Phone = *99***1#

Password = any

Username = any

Stupid Mode = 1

5.4.2、ZTE-mu351(中国移动)的操作步骤

5.4.2.1、设置环境变量

export PATH=/root/cdma:$PATH

export LD_LIBRARY_PATH=/root/cdma:$LD_LIBRARY_PATH

5.4.2.2、插入ZTE-mu351(中国移动)无线网卡

5.4.2.3、等待5秒钟左右、运行eject /dev/sr0。(5.3.3.3也可以使用此方法)

5.4.2.4、运行wvdial

--> WvDial: Internet dialer version 1.54.0

--> Initializing modem.

--> Sending: ATZ

ATZ

OK

--> Sending: ATE0V1

ATE0V1

OK

--> Sending: ATS0=0

OK

--> Sending: AT+CGDCONT=1,"IP","cmnet"

OK

--> Sending: AT+CFUN=1

OK

--> Modem initialized.

--> Sending: ATDT*99***1#

--> Waiting for carrier.

NO CARRIER

--> No Carrier! Trying again.

--> Sending: ATDT*99***1#

--> Waiting for carrier.

NO CARRIER

--> No Carrier! Trying again.

--> Sending: ATDT*99***1#

--> Waiting for carrier.

NO CARRIER

--> No Carrier! Trying again.

--> Sending: ATDT*99***1#

--> Waiting for carrier.

NO CARRIER

--> No Carrier! Trying again.

--> Sending: ATDT*99***1#

--> Waiting for carrier.

^MODE: 15

CONNECT 2800000

--> Carrier detected. Starting PPP

immediately.

--> Starting pppd at Mon Aug 16 16:17:15 2010

--> pid of pppd: 1364

--> Using interface ppp0

--> local IP address 10.67.54.108

--> remote IP address 192.200.1.21

--> primary DNS address 211.136.20.203

--> secondary DNS address 211.136.17.107

6、 参考资料

http://sourceforge.net/projects/libusb/files/libusb-1.0/

http://www.draisberghof.de/usb_modeswitch/

http://www.filewatcher.com/m/usb_modeswitch-1.0.2.tar.bz2.32162.0.0.html

http://www.linuxfromscratch.org/blfs/view/6.1/basicnet/libpcap.html

http://www.linuxfromscratch.org/blfs/view/6.1/connect/dialup.html#ppp

http://code.google.com/p/wvstreams/downloads/detail?name=wvstreams-4.6.1.tar.gz&can=2&q=

http://code.google.com/p/wvstreams/downloads/list

http://ftp.debian.org/debian/pool/main/w/wvdial/

http://code.google.com/p/wvstreams/downloads/list

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值