【正点原子FPGA连载】第十二章U-Boot移植 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

news2024/11/20 4:40:22

1)实验平台:正点原子MPSoC开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html

第十二章U-Boot移植

上一章节我们讲解了uboot的使用,对uboot有了一个初步的了解。前两章我们都是使用的正点原子提供的uboot,本章我们就来学习如何将Xilinx官方的uboot移植到正点原子的ZYNQ MPSoC开发板上,学习如何在uboot中添加我们自己的板子。

12.1U-Boot源码获取及目录分析
12.1.1获取U-Boot源码
Xilinx官方提供的uboot源码发布在github网站https://github.com/Xilinx/u-boot-xlnx,如下图所示:
在这里插入图片描述

图 12.1.1 Xilinx发布的uboot源码
可以从github网站clone或下载uboot源码,注意要与Petalinux版本一致,否则可能会出现一些问题,我们使用的是2019.2版本的Petalinux,所以选择的uboot要带2019.2(Tags带2019.2)。不过我们不从上面的github网站下载,因为在11.2节使用Petalinux配置和编译U-Boot时,Petalinux工具就已经生成了uboot源码,如图 11.2.2 uboot源码所示,所以没有必要从github网站下载。
本章的uboot移植需要使用该源码,为了方便访问以及和后面章节的linux内核源码放在同一目录下,方便管理,我们在当前用户home目录下新建一个名为git.d的文件夹,并将Petalinux生成的uboot源码拷贝到该文件夹下,如下图所示:
在这里插入图片描述

图 12.1.2 拷贝uboot源码到git.d目录
进入~/git.d/u-boot-xlnx目录,输入“git status”和“git remote -v”命令,如下图所示:
在这里插入图片描述

图 12.1.3 git status
可以看到当前uboot源码位于devtool分支,而且与Xilinx发布在github网站的uboot源码是同步的,没有做任何修改。由于笔者没有在github网站找到devtool分支以及tags,所以将其切换到与Petalinux 2019.2版本兼容的最新的tags标签上,也就是tag xilinx-v2019.2,并在此tag上创建分支u-boot-xlnx,命令如下:
git fetch origin tag xilinx-v2019.2
git checkout tags/xilinx-v2019.2 -b u-boot-xlnx
结果如下图所示:
在这里插入图片描述

图 12.1.4 创建u-boot-xlnx分支
当然了,也可以使用默认的devtool分支,没有实质上的区别。
12.1.2U-Boot工程目录分析
在移植uboot之前,我们需要先了解uboot工程目录结构,如下图所示:
在这里插入图片描述

图 12.1.5解压后的uboot
上图中除了oe-logs、oe-workdir和oe-local-files这三个Petalinux工具相关的文件外,其他的文件和文件夹都是uboot源码本身的。这些文件夹或文件的含义如下表所示:
表 12.1.1 uboot目录列表
在这里插入图片描述

上表中的很多文件夹和文件我们都不需要去关注,我们要关注的文件夹或文件如下:
1.arch文件夹
这个文件夹里面存放着和芯片架构有关的文件,如下图所示:
在这里插入图片描述

图 12.1.6 arch文件夹
从上图可以看出有很多架构,比如arm、x86、riscv等,我们现在用的是ARM芯片,所以只需要关注arm文件夹即可,进入arm文件夹里面内容如下图所示:
在这里插入图片描述

图 12.1.7 arm文件夹
mach开头的文件夹是跟具体的设备有关的,比如“mach-exynos”就是跟三星的exyons系列CPU有关的文件。我们使用的是Zynq UltraScale+ MPSoC,所以要关注“mach-zynqmp”这个文件夹。另外“cpu”这个文件夹也是和cpu架构有关的,文件夹内容如下图所示:
在这里插入图片描述

图 12.1.8 cpu文件夹
从上图可以看出有多种ARM架构相关的文件夹,Zynq UltraScale+ MPSoC使用的是Cortex-A53内核,Cortex-A53属于armv8,所以我们要关注“armv8”这个文件夹。cpu文件夹里面有个名为“u-boot.lds”的链接脚本文件,这个就是ARM芯片所使用的u-boot链接脚本文件。armv8文件夹里面的文件都是跟ARMV8架构有关的。
2.board文件夹
board文件夹就是和具体的开发板有关的,打开此文件夹,里面全是不同的板子,borad文件夹里面有个名为“xilinx”的文件夹,里面存放的是Xilinx厂商所有支持uboot的芯片系列,如下图所示:
在这里插入图片描述

图 12.1.9 xilinx文件夹
所有使用xilinx芯片的板子都放到此文件夹中。该文件夹下有7个文件夹,其中bootscripts用于生成启动脚本boot.scr、common是所有开发板通用的、microblaze-generic表示使用microblaze软核IP的FPGA开发板、zynq表示使用ZYNQ-7000系列芯片的开发板、zynqmp表示使用ZYNQ MPSOC系列芯片的开发板、zynqmp_r5表示使用ZYNQ MPSoC系列芯片的R5处理器的开发板、versal表示使用Versal系列芯片的开发板。正点原子的开发板是ZYNQ MPSoC系列的开发板,我们后面移植uboot的时候就是参考zynqmp这个文件夹来定义我们的开发板。
3.configs文件夹
此文件夹为uboot配置文件,uboot是可配置的,但是你要是自己从头开始一个一个项目的配置,那就太麻烦了,因此一般半导体或者开发板厂商都会制作好一个配置文件。我们可以在这个做好的配置文件基础上来添加自己想要的功能,这些半导体厂商或者开发板厂商制作好的配置文件统一命名为“xxx_defconfig”,xxx表示开发板名字,这些defconfig文件都存放在configs文件夹,因此,Xilinx官方开发板的配置文件肯定也在这个文件夹中,如下图所示:
在这里插入图片描述

图 12.1.10 Xilinx芯片系列开发板配置文件
上图中的以“xilinx”开头的文件都是xilinx芯片系列的配置文件。其中“xilinx_zynqmp_zcu102_rev1_0_defconfig”、“xilinx_zynqmp_zcu102_revA_defconfig”、“xilinx_zynqmp_zcu102_revB_defconfig”是我们参考的Xilinx官方的ZYNQ ZCU102开发板配置文件的不同版本,后面我们使用“xilinx_zynqmp_zcu102_rev1_0_defconfig”这个版本的配置文件。
4.Makefile文件
这个是顶层Makefile文件,Makefile是支持嵌套的,也就是顶层Makefile可以调用子目录中的Makefile文件。Makefile嵌套在大项目中很常见,一般大项目里面所有的源代码都不会放到同一个目录中,各个功能模块的源代码都是分开的,各自存放在各自的目录中。每个功能模块目录下都有一个Makefile,这个Makefile只处理本模块的编译链接工作,这样所有的编译链接工作就不用全部放到一个Makefile中,可以使得Makefile变得简洁明了。
uboot源码根目录下的Makefile是顶层Makefile,它会调用其它的模块的Makefile文件,比如drivers/cpu/Makefile。当然了,顶层Makefile要做的工作可远不止调用子目录Makefile这么简单。
5.README
README文件描述了uboot的详细信息,包括uboot该如何编译、uboot中各文件夹的含义、相应的命令等等。建议大家详细的阅读此文件,可以进一步增加对uboot的认识。
关于uboot根目录中的文件和文件夹的含义就讲解到这里,接下来就要开始移植uboot了。
12.2Petalinux使用外部U-Boot源码
上一节我们将Petalinux生成的uboot源码移动到~/git.d/u-boot-xlnx目录(绝对路径/home/shang/git.d/u-boot-xlnx),这样导致Petalinux工程无法使用访问uboot源码了,所以在移植uboot之前,我们了解下如何让Petalinux能访问移动后的uboot源码。
方法如下:

  1. 进入到Petalinux工程目录下,设置好Petalinux工作环境后,输入“petalinux-config”命令配置Petalinux工程。
    设置Linux Components Selection —> u-boot (u-boot-xlnx) —>为“ext-local-src”,如下图所示:
    在这里插入图片描述

图 12.2.1配置u-boot
该配置项将u-boot来源配置为外部的本地源。设置好后按回车键返回。设置External u-boot local source settings —> External u-boot local source path为“/home/shang/git.d/u-boot-xlnx”,也就是当前uboot源码存放的目录,结果如下图所示:
在这里插入图片描述

图 12.2.2 配置External u-boot local source path
保存配置并退出,现在该Petalinux工程就可以访问和使用/home/shang/git.d/u-boot-xlnx中的源码了。
但是笔者在使用petalinux2019.2时,按照上面步骤设置后,编译petalinux工程会出现报错,猜测可能是这个版本的petalinux存在bug。解决的方法是在u-boot-xlnx原来的位置建立一个指向/home/shang/git.d/u-boot-xlnx的链接,如下图所示:
在这里插入图片描述

图 12.2.3 建立u-boot-xlnx链接
需要注意的一点是在Petalinux工程中配置和编译u-boot时需要先清理~/git.d/u-boot-xlnx中的源码(命令make distclean),否则配置和编译会报错,如下图所示:
在这里插入图片描述

图 12.2.4 编译petalinux工程
12.3Xilinx官方开发板uboot编译测试
uboot的移植并不是说我们完完全全的从零开始将uboot移植到我们现在所使用的开发板或者开发平台上。这个对于我们来说基本是不可能的,这个工作一般是半导体厂商做的,半导体厂商负责将uboot移植到他们的芯片上,因此半导体厂商都会自己做一个开发板,这个开发板就叫做原厂开发板,比如大家学习STM32的时候听说过的discover开发板就是ST自己做的。半导体厂商会将uboot移植到他们自己的原厂开发板上,测试好以后就会将这个uboot发布出去,这就是大家常说的原厂BSP包。我们一般做产品的时候就会参考原厂的开发板做硬件,然后在原厂提供的BSP包上做修改,将uboot或者linux kernel移植到我们的硬件上。这个就是uboot移植的一般流程:
① 在uboot中找到参考的开发平台,一般是原厂的开发板。
② 参考原厂开发板移植uboot到我们所使用的开发板上。
正点原子的ZYNQ MPSoC开发板参考的是Xilinx官方的ZYNQ ZCU102开发板做的硬件,因此我们在移植uboot的时候就可以以Xilinx官方的ZYNQ ZCU102开发板为蓝本。
在移植之前,我们先编译一下Xilinx官方ZCU102开发板对应的uboot。编译uboot源码之前,需要先添加交叉编译工具链路径,然后设置环境变量ARCH和CROSS_COMPILE。ARCH指定源码适配的芯片架构,即编译好的uboot运行在什么平台上,CROSS_COMPILE指定所用的交叉编译工具前缀。比如对于ZYNQ MPSoC而言,可以按照如下方式设置:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
而对于我们使用的ZYNQ MPSoC开发板,不用上面的方法设置环境变量,只需要执行10.5节的设置SDK的工作环境即可,SDK会自动设置相应的环境变量,如下图所示:
在这里插入图片描述

图 12.3.1 设置SDK的工作环境
12.3.1查找Xilinx官方的开发板默认配置文件
在12.1.2节U-Boot工程目录分析章节中,configs目录下存放了很多跟Zynq MPSoC有关的配置,如下图所示,
在这里插入图片描述

图 12.3.2 Xilinx官方Zynq MPsoc默认配置文件
从上图可以看出有很多的默认配置文件,其中以xilinx_zynqmp开头的是ZYNQ MPSoc相关开发板的配置文件。其中“xilinx_zynqmp_zcu102_rev1_0_defconfig”、“xilinx_zynqmp_zcu102_revA_defconfig”、“xilinx_zynqmp_zcu102_revB_defconfig”是ZYNQ ZCU102开发板的配置文件。
12.3.2编译Xilinx官方开发板对应的uboot
注:需要先执行10.5节设置SDK的工作环境。
找到Xilinx官方ZYNQ ZCU102开发板对应的默认配置文件以后可以编译一下,这里我们使用“xilinx_zynqmp_zcu102_rev1_0_defconfig”配置文件。编译uboot命令如下:
make distclean
make xilinx_zynqmp_zcu102_rev1_0_defconfig
make -j8
编译完成以后结果如下图所示:
在这里插入图片描述

图 12.3.3编译结果
从上图可以看出,编译成功。其中“make distclean”表示清除所有生成的文件,“make -j8”表示使用8核来编译uboot。“-j”参数用于设置主机使用多少个核来编译uboot,设置的核越多,编译速度越快。-j8表示使用8个核编译uboot,具体设置多少个要根据自己的虚拟机或者电脑配置,如果你给VMware分配了4个核,那么最多只能使用-j4。
编译完成以后会生成u-boot.bin、u-boot.elf、u-boot.dtb等文件。需要下载到开发板上运行的文件有u-boot.elf、u-boot.dtb。这两个文件是运行uboot必不可少的。
12.3.3验证与驱动测试
使用Petalinux工具,测试还是比较方便的,可以直接生成BOOT.bin文件,不过每次生成BOOT.bin文件并将其拷贝到SD卡还是比较麻烦的。最简便的方法是直接使用JTAG下载,使用JTAG下载需要做的准备工作如下:
1)需要手动在Ubuntu虚拟机中安装JTAG驱动,安装方式见5.5小节Linux系统安装JTAG cable驱动;
2)用下载器连接开发板和电脑,连接完成后,进入如下操作将下载器对接到虚拟机中——在Vmware软件的菜单栏点击“虚拟机(M)”菜单,在弹出的子菜单中移动到“可移动设备(D)”,会弹出相应的移动设备,里面带有“Digilent USB”的是JTAG的USB接口,连接该USB接口,如下图所示:
在这里插入图片描述

图 12.3.4在Vmware中连接JTAG的USB接口到虚拟机内
3)开发板的启动模式设置成JTAG启动,开发板上电后,按下PS的复位按键;
4)打开串口软件如SecureCRT或Putty,设置好MPSoc开发板所使用的串口并打开。
做好以上准备工作后,就可以使用JTAG进行下载了。
当然了,使用JTAG下载还是需要借助Petalinux工具的。首先我们设置好Petalinux的工作环境,然后进入第六章Petalinux设计流程实战章节建立的Petalinux工程目录中。由于编译生成的uboot文件不在Petalinux工程范围内,Petalinux无法使用,怎么解决呢?
用软链接就可以了,方法如下:
首先备份Petalinux工程images/linux目录下的u-boot.elf和system.dtb文件,命令如下:
cd images/linux
mv u-boot.elf u-boot.elf.bak
mv system.dtb system.dtb.bak
然后软链接编译生成的u-boot.elf和system.dtb文件,命令如下:
ln -s ~/git.d/u-boot-xlnx/u-boot.elf u-boot.elf
ln -s ~/git.d/u-boot-xlnx/u-boot.dtb system.dtb
结果如下图所示:
在这里插入图片描述

图 12.3.5 软链接u-boot.elf和system.dtb
前面我们说过使用SD卡下载比较麻烦,所以使用JTAG下载,但是笔者通过JTAG下载后,发现不能通过uboot启动内核,原因是对于MPSoc器件,petalinux2019.2不支持petalinux-boot命令下uboot启动linux内核,所以本次实验需要先将linux镜像文件放在SD卡中,然后uboot从SD卡启动镜像。接下来将linux镜像文件image.ub复制到SD卡分区1(boot分区)中,复制完成后按照9.6节拷贝根文件系统到SD卡的ext4分区中的命令卸载SD卡,并将SD卡插到开发板上,如下图所示:
在这里插入图片描述

图 12.3.6 复制image.ub到sd卡分区1
现在用JTAG下载u-boot文件,命令如下(注意,下载前要先设置petalinux环境变量):
petalinux-boot --jtag --fpga --u-boot
在更高版本的petalinux中,可以使用“petalinux-boot --jtag --fpga --u-boot --kernel”命令通过JTAG下载uboot并启动linux内核,但是petalinux2019.2不支持直接通过JTAG下载uboot并启动linux内核。本次测试,我们通过“petalinux-boot --jtag --fpga --u-boot”命令,先将uboot下载到开发板上,然后进入uboot,通过sd卡启动内核。
上面的命令将下载fpga(system.bit)、pmu firmware、FSBL、uboot和ATF(bl31.elf)。执行结果如下图所示(下载前需要按下开发板的PS复位按键,否则会下载失败):
在这里插入图片描述

图 12.3.7 下载u-boot
观察串口接收软件,uboot启动倒计时很短,只有两秒,当出现倒计时的时候,立即按“enter”键进入uboot,如下图所示:
在这里插入图片描述

图 12.3.8 进入uboot
进入uboot后,使用“iminfo”命令查询镜像的起始地址为“0x8000000”,然后使用“fatload”文件系统命令将镜像文件image.ub从SD卡传输到内存中地址0x8000000处,最后通过“bootm”命令启动内核镜像,如下图所示:
在这里插入图片描述

图 12.3.9 串口软件接收情况
从上图可以看到,除了因为以太网的PHY地址不对导致不能找到以太网设备外,是可以正常启动linux内核的。当然了还有一些其他的小问题,比如只检测到了mmc0,这些问题主要跟设备树有关。至于启动linux内核后出现的问题,就不归属于uboot了,后面的章节会解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159415.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CVR预估模型ESMM

1. 概述 一般在对CVR建模的过程中,正样本选择的是在点击后有转化的样本作为正样本,负样本则是在点击后没有转化的样本作为负样本。然而,这样的建模方式存在一定的问题: Sample Selection Bias(SSB)问题&a…

ArcGIS基础实验操作100例--实验90创建点、线、面要素混合的Voronoi

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 空间分析篇--实验90 创建点、线、面要素混合的Voronoi 目录 一、实验背景 二、实验数据 三、实验步骤 …

回收租赁商城系统功能拆解08讲-售后退款

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格,后台调整最终回收价,用户同意回收后系统即刻放款,用户微信零…

使用nginx和ffmpeg搭建HLS流媒体服务器

使用nginx和ffmpeg搭建HLS流媒体服务器 文章目录使用nginx和ffmpeg搭建HLS流媒体服务器1 安装ffmpeg2 安装nginx3 nginx有关HLS参数配置ffmpeg进行HLS切片VLC播放验证最近研究HLS流媒体协议,需要临时搭建HLS服务器,这里记录下搭建的过程(操作系统&#x…

计算机制图设计教程-以全国降水处理为例

前言本博客主要是通过一幅完整数字地图的制作过程,巩固计算机制图内容,报告中涉及到了地图数字化、空间数据的存储与管理、空间数据库的建立、符号化、制图综合技术和空间分析等内容。从而锻炼自身的动手实践能力,了解一幅地图制作设计的完整…

2022年江西省首届职业院校教师数字经济职业技能比赛“信息安全”赛项竞赛任务书

2022年江西省首届职业院校教师数字经济职业技能比赛“信息安全”赛项竞赛任务书 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 90分钟 200分 A-2 数据库加固 A-3 服务加固 A-4 防火墙策略 B模块 B-1 Windows操作系统渗透测试 400分 B…

云间玉兔,自出机抒,从零开始制作Web插件网页特效小兔子组件(小挂件widget),基于原生CSS/NPM

著意登楼瞻玉兔,何人张幕遮银阙?又到了一年一度的网页小挂件环节,以往我们都是集成别人开源的组件,但所谓熟读唐诗三百首,不会做诗也会吟,熟读了别人的东西,做几首打油诗也是可以的,…

数据降维-MDS 算法

数据降维-MDS 算法 文章目录数据降维-MDS 算法算法概述算法步骤算法证明代码参考算法概述 MDS的初衷是将图结构中的距离在空间的一种表示。 例如,已知几个城市的距离,但是不知道城市的坐标,那么MDS就能通过距离矩阵转换成空间坐标向量来近似…

mock的基本使用

mock的基本使用官网文档mockjs是用来模拟产生一些虚拟的数据,可以让前端在后端接口还没有开发出来时独立开发,mockjs可以拦截ajax请求,返回设定好的数据。注意:mock(模拟数据)数据需要使用到mockjs模块&…

如何用更好的创意引发卖家和消费者的共鸣?

我们知道,近年来国家的政策越来越向创新型的企业发展倾斜,因此各行各业都响应政策,做创新型高质量发展,跨境电商作为疫情下应运而生的产物,其本身就带有创新型发展的概念,同时,面对着2022年许多…

Java程序的运行过程(执行流程)分析

万事知其然,要知其所以然,所以本节带大家来详细了解一下 Java 程序的执行过程。从《使用记事本编写运行Java程序》一节的案例可以看出,Java 程序的运行必须经过编写、编译和运行 3 个步骤。编写:是指在 Java 开发环境中进行程序代…

回溯法--图的m着色问题

问题描述给定无向连通图和m种不同的颜色,用这些颜色为图G的各个顶点着色,每个顶点有一种颜色是否有一种着色方法?使得图G中每条边的两个顶点有不同的颜色这个问题就是图的m可着色判定问题色数:如果有一个图最少需要m种颜色才能使得…

国医大师体验照“镜”测“三高”,深兰科技AI产品秒出健康报告

“请把脸缓慢往左转。” “请将脸回正,请将脸缓慢往右转。” “请放松心情,期待3D面部的生成结果。” 跟随提示音,刚刚被聘任为深兰科技科学院专家委员会医学专家的国医大师严世芸教授饶有兴致地体验着深兰科技AI生理健康检测仪-扁鹊。等待一…

【位图】面对海量数据,如何压缩空间?定位数据?

目录 一、腾讯面试题 二、解决办法——位图 2.1、那么什么是位图? 三、位图的模拟实现 3.1、位图的构造 3.2、存放数据 3.3、检测数据是否存在 3.4、设置某个数据的对应位为0 四、位图模拟代码(完整) 一、腾讯面试题 给40亿个不重复…

Authing 入选 2022 中国产业数字化领军企业

1 月 10 日,产业互联网第一媒体产业家联合数字化报、IT 桔子正式发布了【中国产业数字化领军企业榜单】,评选出 16 个互联网赛道中的领军企业。作为身份认证与访问管理领跑者,Authing 凭借在 SaaS 领域的技术创新与产品优势,成功入…

6.4、域名系统 DNS

1、DNS的作用 如下所示,因特网中的某台主机要访问某台 Web 服务器 只需在用户主机中运行某个游览器软件,在其地址栏中输入要访问的 Web 服务器的域名,并按下回车键即可访问到 Web 服务器所提供的内容 我们在用户主机中使用 ping 命令测试 We…

【小练】day1

day1 选择题 1. 以下for循环的执行次数是&#xff08;&#xff09;。 for(x0,y0;(y123)&&(x<4););A 是无限循环 B 循环次数不定 C 4 D 3 本题主要考察for for(初始化部分&#xff1b;条件判断部分&#xff1b;调整部分) 初始化部分只执行一次。 &&&a…

大数据分析案例-基于多元线性回归算法构建广告投放收益模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

走好这三步,不再掉进云上安全的沟里!

序言一直以来&#xff0c;公有云安全是横亘在广大用户面前的一道鸿沟。云安全&#xff08;Cloud Security&#xff09;是指用于控制云计算的安全性、合规性和其他使用风险的过程、机制和服务。公有云提供商们都强调安全是其最高优先级工作&#xff0c;动辄就发布上百页的云上安…

谁还没个技术呢~PYTHON制作观看软件

前言 大家早好、午好、晚好吖 ❤ ~ 以前没钱时&#xff0c;我是这样嘚&#xff1a; 朋友说好一生一起走&#xff0c;账号先借我来耍耍 现在没钱时&#xff0c;我是这样嘚&#xff1a; 涨价就涨价&#xff0c;怎么还搞搞限制账号登录这一出呢~ 这年头~谁还没点技术不是,看我…