资讯
HOME
资讯
正文内容
spl nand load image 为U-boot 添加新的board
发布时间 : 2024-10-18
作者 : 小编
访问数量 : 23
扫码分享至微信

为U-boot 添加新的board

U-boot代码层次

如何添加board

添加board的基本步骤

test board添加示例

添加target配置选项

添加config头文件

添加dtb文件

添加board文件

创建defconfig配置文件

spl支持semihost启动

U-boot代码层次

uboot需要支持众多的硬件,并且具有良好的可扩展性、可移植性和可维护性,因此必须要有一个设计良好的代码架构。代码架构的设计总是与软硬件架构密不可分的,在硬件层面嵌入式系统的核心一般包括以下层次:

(1)目标板:它包含了系统运行所需的所有组件,如SOC芯片、DDR、flash/emmc存储器、各种外设以及时钟源、电源管理芯片等

(2)SOC:它包含了cpu、总线控制器、集成在片内的rom、sram、dma控制器、硬件加速器、异构核,以及片内时钟、电源控制模块等

(3)处理器架构:它一般指处理器体系结构的大版本,不同的体系结构之间可能存在不同的指令集、异常模型以及内存模型等。例如对于arm系列架构,armv8和armv7就属于不同的处理器架构

(4)cpu型号:它是指处理器的具体型号,如cortex-a53或cortex-a72等

一般cpu型号和处理器架构数量相对较少,如对于arm架构来说一般就是arm官方发布的这些型号。而soc型号就要多一些,它主要是各芯片公司基于特定cpu架构以及其它ip模块,设计的专用或通用芯片,如高通或海思设计的手机芯片。最后就是以soc芯片为核心设计的目标板了,在目标板上基本上集成了一款产品所需的所有组件,如一款手机的电路板。它们之间的简单关系如下图:

Uboot的代码设计也遵循以上层次,arch目录包含了处理器架构相关代码,arch/cpu目录包含了特定cpu代码,而board目录则包含了特定目标板的代码。因此当我们新增加一款目标板时,主要的工作就可以集中在board相关的代码,只要不是太新的cpu型号,arch和cpu相关代码在uboot官方版本中都已经被支持。因此可以直接复用这部分实现,我们唯一要做的就是选择正确的配置选项。

如何添加board

添加board的基本步骤

当我们开始一个全新的项目时,总是希望能先让系统能运行起来,然后再在此基础上为其添加更多的feature,这个只包含能让系统运行所需模块的系统,叫做最小系统。cpu能正常运行包含以下几个条件:

(1)具有合适的电源和时钟

(2)程序代码被加载到合适的位置,cpu能够正常获取指令

(3)具有cpu用于数据操作的可读写内存

(4)cpu被release reset 当然对于需要支持中断的系统,则还需要包含中断控制器,而对于像操作系统这种需要通过定时器驱动进程切换的系统,则显然还需要timer定时器。为了达到以上目的,我们添加board的基本步骤大概如下: (1)在board目录下为新board添加一个目录,用于存放board特定的代码

(2)为新目录添加Kconfig配置选项和Makefile编译选项,将其添加到编译系统中

(3)在Kconfig中为该board定义一个配置项,并为该配置项添加其所支持的特性,如cpu架构、cpu型号等

(4)为新board增加一个配置相关的头文件和编译所需的defconfig文件,用于该board相关的选项配置

(5)在board目录下添加适当的文件,并实现必要的接口

test board添加示例

添加target配置选项

在arch/arm/Kconfig的board select菜单下新增如下的TARGET_TESTBOARD配置选项:

config TARGET_TESTBOARDbool "Qemu test board" select ARM64 select DM select DM_SERIAL select PL01X_SERIAL select SUPPORT_SPL select SPL if SUPPORT_SPL select SPL_FRAMEWORK_BOARD_INIT_F if SPL select SPL_SERIAL_SUPPORT select PL011_SERIAL if SPL select SPL_LIBGENERIC_SUPPORT if SPL select SPL_LIBCOMMON_SUPPORT if SPL

它将在后面的configs/testboard_defconfig中通过CONFIG_ TARGET_TESTBOARD =y选择

在arch/arm/Kconfig文件中添加以下内容,以包含board的Kconfig文件

source "board/mars/test/Kconfig"

添加config头文件

在include/configs目录下添加config头文件testboard.h,并添加以下内容:

#ifndef __CONFIG_H#define __CONFIG_H#include <linux/sizes.h>#define CONFIG_SYS_SDRAM_BASE 0x40000000/* The DTB generated by QEMU is placed at start of RAM, stay away from there */#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + SZ_2M)#define CONFIG_SYS_LOAD_ADDR (CONFIG_SYS_SDRAM_BASE + SZ_2M)#define CONFIG_SYS_MALLOC_LEN SZ_16M#define CONFIG_SYS_BOOTM_LEN SZ_64M#define CONFIG_SYS_HZ 1000#define CONFIG_PL01x_PORTS {(void *)(0x9000000)}#define CONFIG_PL011_CLOCK 1#define CONFIG_SYS_UBOOT_START 0x40300000#define BOOT_TARGET_DEVICES(func) \ func(VIRTIO, virtio, 0)#define CONFIG_EXTRA_ENV_SETTINGS \"fdt_addr=0x43000000\0" \"kernel_addr_r=0x40000000\0" \"bootargs=earlycon root=/dev/vda\0" \"bootcmd=smhload /home/lgj/work/linux/arch/arm64/boot/Image ${kernel_addr_r};" \"smhload /home/lgj/work/linux/arch/arm64/boot/dts/qemu/test-board-smc.dtb ${fdt_addr};" \"booti ${kernel_addr_r} - ${fdt_addr}\0"#define CONFIG_SYS_CBSIZE 512#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE#define CONFIG_SYS_MAX_FLASH_BANKS_DETECT 2#define CONFIG_SYS_MAX_FLASH_SECT 256 /* Sector: 256K, Bank: 64M */#define CONFIG_CFI_FLASH_USE_WEAK_ACCESSORS#define CONFIG_SPL_MAX_SIZE 0x25000#define CONFIG_SPL_STACK (CONFIG_SYS_SDRAM_BASE + SZ_1M)#define CONFIG_SPL_BSS_START_ADDR (CONFIG_SYS_SDRAM_BASE + SZ_1M)#define CONFIG_SPL_BSS_MAX_SIZE 0x1000#endif

添加dtb文件

使用qemu模拟器启动uboot时,模拟器会提供一个默认的dtb文件,但是我们也可以使用自己自定义的dtb文件,以下是自定义dtb文件的方法:

在arch/arm/dts/目录下添加dts文件test-board-minimal.dts,并在目录的Makefile中添加以下编译选项

dtb-$(CONFIG_TARGET_TESTBOARD) += test-board-minimal.dtb在配置文件configs/testboard_defconfig中指定该dtb为默认dtb文件,并使能uboot的设备树支持

CONFIG_DEFAULT_DEVICE_TREE="test-board-minimal"CONFIG_OF_CONTROL=yCONFIG_OF_SEPARATE=y

添加board文件

在board目录下创建mars/test目录在board/mars/test目录下创建Kconfig文件,并添加如下内容

if TARGET_TESTBOARDconfig SYS_VENDORdefault "mars"config SYS_BOARDdefault "test"config SYS_CONFIG_NAMEdefault "testboard"endif

其中:

SYS_VENDOR:用于指定该board的vendor名,它与SYS_BOARD一起确定会被编译的board代码路径。即board/< SYS_VENDOR >/common和board/< SYS_VENDOR >/< SYS_BOARD >的路径下的Makefile会被执行,在我们的例子中该目录为board/mars/common/和board/mars/test/SYS_BOARD:用于指定在board/< SYS_VENDOR >下需要编译的board路径,如当前配置下该目录为board/mars/test/

SYS_CONFIG_NAME用于指定include/configs目录下的头文件名,如当前配置该文件即为include/configs/testboard.h

在board/mars/test目录下创建MAINTAINERS文件,并添加如下内容

QEMU QEMU TEST BOARDM: xxx@yyy.comS: MaintainedF: board/mars/testF: include/configs/testboard.hF: configs/testboard.h在board/mars/test目录下创建Makefile文件,并添加如下内容

obj-y += testboard.o创建board/mars/test目录下创建testboard.c文件,并添加如下内容

include <common’s>#include <cpu_func.h>#include <fdtdec.h>#include <init.h>#include <spl.h>#ifdef CONFIG_ARM64#include <asm/armv8/mmu.h>static struct mm_region testboard_mem_map[] = { {/* Flash */ .virt = 0x00000000UL, .phys = 0x00000000UL, .size = 0x08000000UL, .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | PTE_BLOCK_INNER_SHARE }, {/* Lowmem peripherals */ .virt = 0x08000000UL, .phys = 0x08000000UL, .size = 0x38000000, .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | PTE_BLOCK_NON_SHARE | PTE_BLOCK_PXN | PTE_BLOCK_UXN }, {/* RAM */ .virt = 0x40000000UL, .phys = 0x40000000UL, .size = 255UL * SZ_1G, .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | PTE_BLOCK_INNER_SHARE }, {/* Highmem PCI-E ECAM memory area */ .virt = 0x4010000000ULL, .phys = 0x4010000000ULL, .size = 0x10000000, .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | PTE_BLOCK_NON_SHARE | PTE_BLOCK_PXN | PTE_BLOCK_UXN }, {/* Highmem PCI-E MMIO memory area */ .virt = 0x8000000000ULL, .phys = 0x8000000000ULL, .size = 0x8000000000ULL, .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | PTE_BLOCK_NON_SHARE | PTE_BLOCK_PXN | PTE_BLOCK_UXN }, {/* List terminator */0, }};struct mm_region *mem_map = testboard_mem_map;#endifint board_init(void){return 0;}int dram_init(void){if (fdtdec_setup_mem_size_base() != 0)return -EINVAL;return 0;}int dram_init_banksize(void){ fdtdec_setup_memory_banksize();return 0;}void *board_fdt_blob_setup(void){/* QEMU loads a generated DTB for us at the start of RAM. */return (void *)CONFIG_SYS_SDRAM_BASE;}void enable_caches(void){ icache_enable(); dcache_enable();}#ifdef CONFIG_SPLu32 spl_boot_device(void){return BOOT_DEVICE_SEMIHOSTING;}#endif

创建defconfig配置文件

在configs目录下为testboard创建配置文件testboard_defconfig,并添加如下内容

CONFIG_ARM=yCONFIG_TARGET_TESTBOARD=yCONFIG_POSITION_INDEPENDENT=yCONFIG_NR_DRAM_BANKS=1CONFIG_ENV_SIZE=0x40000CONFIG_ENV_SECT_SIZE=0x40000CONFIG_DEFAULT_DEVICE_TREE="test-board-minimal"CONFIG_ENV_ADDR=0x4000000CONFIG_OF_CONTROL=yCONFIG_OF_SEPARATE=yCONFIG_DM_SERIAL=yCONFIG_DM_ETH=yCONFIG_SYSRESET=yCONFIG_SEMIHOSTING=y# add boot stage info to fdtCONFIG_OF_FDT=yCONFIG_SPL_SYS_MALLOC_F_LEN=0x1000CONFIG_SPL_TEXT_BASE=0x40000000CONFIG_CONS_INDEX=0CONFIG_SYS_TEXT_BASE=0x40300000# CONFIG_DISPLAY_CPUINFO is not set

spl支持semihost启动

将arch/arm/lib/semihosting.c中smh_load_file导出,即去掉下面定义中的static

static int smh_load_file(const char * const name, ulong load_addr, ulong *end_addr){ …}将arch/arm/lib/semihosting.c中的do_smhload文件修改为只有uboot编译,即将其修改为:

#ifndef CONFIG_SPL_BUILDstatic int do_smhload(struct cmd_tbl *cmdtp, int flag, int argc,char *const argv[]) {}#endif在arch/arm/include/asm/spl.h的BOOT DEVICE枚举中添加对semihosting的支持

enum { … BOOT_DEVICE_SEMIHOSTING, BOOT_DEVICE_NONE}; 在common/spl/目录下添加文件spl_semihosting.c,并添加以下内容:

#include <image.h>#include <spl.h>extern int smh_load_file(const char * const name, ulong load_addr, ulong *end_addr);static int spl_sh_load_image(struct spl_image_info *spl_image, struct spl_boot_device *bootdev){int rc; ulong uboot_load_addr = 0x40300000, uboot_end_addr; rc = smh_load_file("u-boot.bin", uboot_load_addr, &uboot_end_addr);if (rc < 0) {if (CONFIG_IS_ENABLED(SHOW_ERRORS) && CONFIG_IS_ENABLED(LIBCOMMON_SUPPORT))printf(SPL_TPL_PROMPT "load file u-boot.bin failed (err=%d)\n", rc);elseputs(SPL_TPL_PROMPT "load file u-boot.bin failed\n");return -1; } spl_image->load_addr = uboot_load_addr; spl_image->entry_point = uboot_load_addr; spl_image->os = IH_OS_U_BOOT;return 0;}SPL_LOAD_IMAGE_METHOD("SEMIHOSTING", 0, BOOT_DEVICE_SEMIHOSTING, spl_sh_load_image);

end

人人极客社区

关注,回复【peter 】海量Linux资料赠送

文章推荐

☞【专辑】☞【专辑】

April 4 双语新闻精选:故宫天灯复原品拍出1060万元为哪般?Royal lantern copies sold

觉得我们还不错?点上方“蓝色字”,follow us!

热词

independent enrollment

自主招生

cut back

削减;修剪;(美)倒叙

文末还可直达我们的打卡小程序哦!

Royal lantern copies sold

故宫天灯拍出1060万元

A pair of historically accurate Heavenly Lanterns (tian deng) created by the Palace Museum sold for 10.6 million yuan at acharity auction Tuesday. At the same auction, a pair ofLongevity Lanterns (wanshou deng) and five pairs of smaller royal lanterns were sold, according to a Palace Museum press release.

故宫博物院发布消息称,该院制作的一对天灯复原品在2日的一场慈善拍卖会上以1060万元落槌。这场拍卖会上还拍出了一对万寿灯和5对稍小的宫灯的复原品。

The lanterns were accurate copies based on archives from the Qing Dynasty (1644-1911) and used at the museum's special exhibition for Spring Festival this year. The money raised from the auction will be used to sponsor education and cultural programs in impoverished regions.

这些灯笼是根据清代档案精准复原的,曾在今年春节故宫举行的特别展览中展出。此次拍卖所得将用于资助贫困地区的教育和文化项目。

重点词汇

1、heavenly

英 /'hev(ə)nlɪ/ 美 /'hɛvnli/

adj. 天上的;神圣的;天国似的

adv. 无比;极其

2、lantern

英 /'læntən/ 美 /'læntɚn/

n. 灯笼;提灯;灯笼式天窗

3、charity

英 /'tʃærɪtɪ/ 美 /'tʃærəti/

n. 慈善;施舍;慈善团体;宽容;施舍物

4、longevity

英 /lɒn'dʒevɪtɪ/ 美 /lɔn'dʒɛvəti/

n. 长寿,长命;寿命

5、archive

美 /'ɑrkaɪv/

n. 档案馆;档案文件

vt. 把…存档

US makes 2033 Mars mission

NASA:2033年载人上火星

NASA administrator Jim Bridenstine announced at a congressional testimony on Tuesday a plan to put humans on Mars by 2033 and would request more money to fund the ambitious plan.

美国航天局(NASA)局长吉姆•布里登斯廷2日在国会的一场听证会上宣布,NASA计划在2033年将宇航员送上火星,并要求国会为这项雄心勃勃的计划提供更多资金。

It came after NASA's new schedule to land American astronauts on the moon by 2024, four years ahead of its previous schedule, an aggressive plan USVice-President Mike Pence called a "stated policy of this administration", but American lawmakers worried NASA couldn't meet the deadline.

此前NASA将美国宇航员登陆月球的时间更改为2024年,比原计划提前了4年。美国副总统彭斯将这项激进的重返月球计划称为"本届政府的一项国策",但议员们对NASA能否在最后期限前完成使命表示质疑。

Pence urged NASA last week to return American astronauts to the moon within five years, warning that if NASA cannot do it, it is NASA, not the mission, that must change. Bridenstine cited at the congressional hearing on NASA's budget in fiscal year 2020 the goal of putting astronauts on Mars by 2033 as a reason why NASA needed toaccelerate the moon landing plan.

彭斯上周向NASA施压,要求其在5年内实现宇航员重返月球的任务,并称如果NASA办不到,则NASA需要作出改变,而不是任务本身。在国会举行的关于NASA的2020财政年度预算的听证会上,布里登斯廷表示,2033年将宇航员送上火星的目标意味着登月计划需要提速。

The NASA chief said so in response to US congresswoman Eddie Bernice Johnson's question why the country needs a "crash program for the moon". "The moon is the proving ground," said Bridenstine. "We canmove up the Mars landing by moving up the moon landing."

面对女议员艾迪•伯尼斯•约翰逊关于"为什么美国要加速登月脚步"的提问时,布里登斯廷回答道:"因为月球是试验场,载人登月计划提速,载人火星计划才能提速。"

重点词汇

1、testimony

英 /'testɪmənɪ/ 美 /'tɛstə'moni/

n. [法] 证词,证言;证据

2、aggressive

英 /ə'gresɪv/ 美 /ə'ɡrɛsɪv/

adj. 侵略性的;好斗的;有进取心的;有闯劲的

3、Vice-president

英 /,vais'prezidənt/

n. 副总裁;副总统;副校长

4、fiscal

英 /'fɪsk(ə)l/ 美 /'fɪskl/

adj. 会计的,财政的;国库的

5、accelerate

英 /ək'seləreɪt/ 美 /əkˈsɛləˌret/

vt. 使……加快;使……增速

vi. 加速;促进;增加

6、in response to

响应;回答;对…有反应

7、move up

提升,上升;向前移动

Meghan back on Instagram

哈里梅根官宣社交账号

The Duke and Duchess of Sussex have launched their own Instagram account. The official account for Harry and Meghan, sussexroyal, will be used for "important announcements" and to share the work that drives them. In their first post, Harry and Meghan said: "Welcome to our official Instagram; we look forward to sharing the work that drives us, the causes we support, important announcements, and the opportunity to shine a light on key issues."

苏塞克斯公爵和公爵夫人近日发布自己的Instagram账号。哈里和梅根的官方账号sussexroyal将用于发布"重要公告",分享他们的工作。在他们发布的第一条帖子里,哈里和梅根说:"欢迎来到我们的官方Instagram,我们期待分享我们的工作,我们支持的事业,重要的公告,以及我们对关键问题的看法。"

The first image was a navy background with the couple's royalcypher - theentwined initials H and M below acoronet - in white. It already has more than 1 million followers. It comes as the duke and duchesssplit their household office from that of the Duke and Duchess of Cambridge. Meghan and Harry's support team will be based at Buckingham Palace, instead of Kensington Palace, from this spring.

这对夫妇发布的首张图片以海军蓝为底色,上面有代表两人名字的白色标识,即一顶皇冠下交缠着的H和M。目前该账号已拥有超过100万的粉丝。该账号发布之时正值苏塞克斯公爵夫妇与剑桥公爵夫妇正式"分家"。自今年春天起,梅根和哈里的支持团队的驻地将从肯辛顿宫迁往白金汉宫。

重点词汇

1、shine a light on

使……显现出来;照亮;照耀

2、navy

英 /'neɪvɪ/ 美 /'nevi/

n. 海军

深蓝色的

3、cypher

英 /'saɪfə/

n. [数] 零;零的记号;密码索引书

vi. 计算

vt. 计算;用密码书写

4、entwine

英 /ɪn'twaɪn; en-/ 美 /ɪn'twaɪn/

vt. 缠住;盘绕;使缠绕

vi. 缠住;盘绕

5、coronet

英 /'kɒr(ə)nɪt/ 美 /,kɔrə'nɛt/

n. (王子、贵族等戴的)小冠冕;冠状头饰;(马的)蹄冠

6、split

英 /splɪt/ 美 /splɪt/

vt. 分离;使分离;劈开;离开;分解

vi. 离开;被劈开;断绝关系

n. 劈开;裂缝

adj. 劈开的

Independent enrollments cut

高校自主招生名额缩减

Universities in China have reduced their quotas for the independent enrollment of high school graduates. Wuhan University in Hubei province has reduced the quota for independent enrollment from 350 last year to 192 in 2019. Central South University in Changsha, Hunan province, reduced its quota from 420 in 2018 to 120 this year.

我国不少高校对自主招生名额进行了压缩。位于湖北省的武汉大学2019年的自主招生计划为192人,较去年的350人下降明显。位于湖南长沙的中南大学今年的自主招生计划为120人,而去年该校自主招生人数为420人。

Universities are also cutting back on thepreferential treatment of independently enrolled students. For example, China University of Political Science and Law and the University of Science and Technology Beijing will give fewer extra points this year to students who seek to be admitted through independent enrollment.

高校自主招生的优惠政策也有所缩水,例如,中国政法大学和北京科技大学今年给予想通过自主招生的方式进入高校的考生的优惠分变少。

Independent enrollment, initiated in 2003, is a part of China's educational reforms, giving conditional offers to students who exhibit talents or achievements in specific fields so that they may enter the university with lower admission scores.

作为中国教育改革的一部分,自主招生始于2003年,其目的是对在特定领域表现出天赋或成就的学生给予有条件的录取,使他们可以以较低的录取分数进入大学。

Currently, 90 universities have allocated 5% of their enrollment slots to independent students with special talents. They admit more than 20,000 such students every year.

目前我国有90所高校实行自主招生,自主招生名额占其总招生名额的5%。每年超过2万人通过自主招生进入大学。

重点词汇

1、quota

英 /'kwəʊtə/ 美 /'kwotə/

n. 配额;定额;限额

2、cut back

/'kʌtbæk/

削减;修剪;(美)倒叙;急忙返回

3、preferential

英 /,prefə'renʃ(ə)l/ 美 /,prɛfə'rɛnʃl/

adj. 优先的;选择的;特惠的;先取的

4、slot

英 /slɒt/ 美 /slɑt/

n. 位置;狭槽;水沟;硬币投币口

vt. 跟踪;开槽于

文章

精选

●笑哭!这些照片里的东西,真不是你想的那样!

●《复仇者联盟4》之后,还有哪些漫威电影可以看?

●赏樱季来啦!关于樱花你可能不知道的10件事

喜欢我们的文章?

就点亮下方的在看吧!

相关问答

splash是什么意思_作业帮

[回答]splash[英]splæʃ[美]splæʃ.vt.使(液体)溅起vi.(指液体)溅落n.(光、色等的)斑点;溅泼声;溅上的斑点;溅泼的量[例句]Nowaddthebigsplas...

建筑CAD具体知识点比如:点的特性,线的特性等以及全部快捷键(例:按住Ctrl+右键对象捕捉菜单)?

直线:L圆:C弧:A椭圆:EL矩形:REC圆环:DO多义线:PL点:PO图样填充:H样条曲线:SPL双点射线:XL册除:E复制:CO或CP镜像:MI阵列:AR移动......

用金山特大字打印如何打印彩色字

[回答]自己保存都存为PSD格式(方便以后修改);印刷时存为TIFF/JPEG都可以(图层合并,为了防止发生不经意的改动等问题);喷绘时一般存为JPEG格式(文件较小...

CAD快捷键有关可打开是对话框的有哪些命令? - 球球roye1017 ...

你是想要打开什么功能的快捷键?直线:L圆:C弧:A椭圆:EL矩形:REC圆环:DO多义线:PL点:PO图样填充:H样条曲线:SPL双点射线:XL册除:E复制:CO或CP镜像:MI...

代码,请专家看下是怎么回事。 - Microsoft Community

[回答]对于您Windows7不定时蓝屏的问题,请问您最近有更改过您的计算机吗?您是什么时候开始蓝屏的?根据您的蓝屏报错0x0000001A错误表示内存管理遇到了问...

 工人物语7  creepin up on you 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2024  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部