RK3568 学习笔记 : u-boot 千兆网络无法 ping 通PC问题的解决方法二

参考

  • RK3568 学习笔记 : u-boot 千兆网络无法 ping 通PC问题的解决

前言

  • rk3568 rockchip 提供的 u-boot,默认的设备树需要读取 单独分区 resouce.img 镜像中的 设备树文件,也就是 Linux 内核的设备树 dtb 文件,gmac 网络才能正常的 ping 通 PC 主机。

  • 如果使用 u-boot 默认的设备树,虽然可以正常的识别到 gmac 设备,但是无法 ping 通 PC 主机,也就是 u-boot 下网络功能异常。

环境

  • 正点原子 RK3568 开发板: AtomPi-CA1DLRK3568 开发板

  • 虚拟机 ubuntu 20.04 单独编译 开发板提供的 u-boot,并去掉 rockchip 一些定制的选项,如使用 resouce 分区等

相关的修改

  • 取消【勾选】一些 rockchip 的配置选项

在这里插入图片描述
在这里插入图片描述

[ ] Enable support for rockchip resource image 
[ ] Rockchip vendor storage partition support
[ ] Using dtb from Kernel/resource for U-Boot
  • 取消后,重新编译 u-boot,发现启动后,提示 env emmc 异常,此时需要修改一下 common/board_r.c 文件

  • rockchip 为了实现 env 通过读取 resource 分区,对初始化次序做了一些调整,需要调整回去,也就是 env 的初始化需要默认放在 mmc 初始化的后面

在这里插入图片描述

  • 这里主要是关闭了 CONFIG_USING_KERNEL_DTB,造成了 initr_env 初始化放在了 initr_mmc 前面,改到后面,就可以正常的 初始化 env 了(env 保存在 emmc 中)

设备树问题

  • 如果使用 u-boot 默认的设备树,gmac 网络无法 ping 通,如果把 u-boot 下的整个设备树,替换为 rockchip Linux kernel 中的设备树,gmac 网络可以正常 ping 通,说明问题点在 设备树的配置上。

  • u-boot 下的设备树,如果全部替换为 Linux kernel 的设备树,比较的麻烦,需要替换很多文件,包括 dt-bindings 头文件等,因为 u-boot 下的设备树与 Linux kernel 的设备树属于两套独立的设备树。Linux kernel 的设备树相对齐全与复杂一些。

  • 通过对比 u-boot 与 Linux kernel 的 设备树,发现 gmac 的相关的设置均一致,排除了 gmac 设置问题。

  • 那到底什么会影响 gmac 的网络功能呢? gmac 网络设备能正常的初始化,没有报错。

问题排查

  • 通过查看 开发板的原理图,发现了一些思路,电源管理,也就是 Linux 内核的设备树,与 rk809 pmic 的电源管理配置,而 u-boot 下,并没有这个配置。

  • 经过仔细查看原理图,发现 gmac 的 io 供电 vcc_1v8,来自 rk809 pmic 电源管理芯片,而这个 pmic 电源管理芯片,默认需要使用 i2c 通信配置,如果不配置,默认的配置,可能供电异常。

在这里插入图片描述

在这里插入图片描述

  • 抱着尝试的心态,在 u-boot 下的开发板设备树文件中,增加 rk809 相关的配置(来自 Linux kernel 设备树配置),并使能了 电源域,测试发现,网络可以 Ping 通了,说明网络 u-boot 默认设备树缺少 pmic 电源管理部分,造成网络无法正常 ping 通

  • 增加的电源管理部分 rk809 相关的设备树配置如下:DLRK3568 开发板 arch/arm/dts/atk-dlrk3568.dts 文件

/** SPDX-License-Identifier:     GPL-2.0+** (C) Copyright 2020 Rockchip Electronics Co., Ltd*//dts-v1/;
#include "rk3568.dtsi"
#include "rk3568-u-boot.dtsi"
#include <dt-bindings/input/input.h>/ {model = "ATK-DLRK3568 Rockchip RK3568 Board";compatible = "rockchip,rk3568-evb", "rockchip,rk3568";dc_12v: dc-12v {compatible = "regulator-fixed";regulator-name = "dc_12v";regulator-always-on;regulator-boot-on;regulator-min-microvolt = <12000000>;regulator-max-microvolt = <12000000>;};vcc3v3_sys: vcc3v3-sys {compatible = "regulator-fixed";regulator-name = "vcc3v3_sys";regulator-always-on;regulator-boot-on;regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;vin-supply = <&dc_12v>;};vcc5v0_sys: vcc5v0-sys {compatible = "regulator-fixed";regulator-name = "vcc5v0_sys";regulator-always-on;regulator-boot-on;regulator-min-microvolt = <5000000>;regulator-max-microvolt = <5000000>;vin-supply = <&dc_12v>;};vcc5v0_usb: vcc5v0-usb {compatible = "regulator-fixed";regulator-name = "vcc5v0_usb";regulator-always-on;regulator-boot-on;regulator-min-microvolt = <5000000>;regulator-max-microvolt = <5000000>;vin-supply = <&dc_12v>;};adc-keys {compatible = "adc-keys";io-channels = <&saradc 0>;io-channel-names = "buttons";keyup-threshold-microvolt = <1800000>;u-boot,dm-spl;status = "okay";volumeup-key {u-boot,dm-spl;linux,code = <KEY_VOLUMEUP>;label = "volume up";press-threshold-microvolt = <17822>;};volumedown-key {u-boot,dm-spl;label = "volume down";linux,code = <KEY_VOLUMEDOWN>;press-threshold-microvolt = <415385>;};};
};&mdio0 {rgmii_phy0: phy@0 {compatible = "ethernet-phy-ieee802.3-c22";reg = <0x0>;};
};&mdio1 {rgmii_phy1: phy@0 {compatible = "ethernet-phy-ieee802.3-c22";reg = <0x0>;};
};&gmac0 {phy-mode = "rgmii";clock_in_out = "output";snps,reset-gpio = <&gpio2 RK_PD3 GPIO_ACTIVE_LOW>;snps,reset-active-low;/* Reset time is 20ms, 100ms for rtl8211f */snps,reset-delays-us = <0 20000 100000>;assigned-clocks = <&cru SCLK_GMAC0_RX_TX>, <&cru SCLK_GMAC0>;assigned-clock-parents = <&cru SCLK_GMAC0_RGMII_SPEED>;assigned-clock-rates = <0>, <125000000>;pinctrl-names = "default";pinctrl-0 = <&gmac0_miim&gmac0_tx_bus2&gmac0_rx_bus2&gmac0_rgmii_clk&gmac0_rgmii_bus>;tx_delay = <0x3c>;rx_delay = <0x2f>;phy-handle = <&rgmii_phy0>;status = "okay";
};&gmac1 {phy-mode = "rgmii";clock_in_out = "output";snps,reset-gpio = <&gpio2 RK_PD1 GPIO_ACTIVE_LOW>;snps,reset-active-low;/* Reset time is 20ms, 100ms for rtl8211f */snps,reset-delays-us = <0 20000 100000>;assigned-clocks = <&cru SCLK_GMAC1_RX_TX>, <&cru SCLK_GMAC1>;assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>;assigned-clock-rates = <0>, <125000000>;pinctrl-names = "default";pinctrl-0 = <&gmac1m1_miim&gmac1m1_tx_bus2&gmac1m1_rx_bus2&gmac1m1_rgmii_clk&gmac1m1_rgmii_bus>;tx_delay = <0x4f>;rx_delay = <0x26>;phy-handle = <&rgmii_phy1>;status = "okay";
};&crypto {status = "okay";
};&uart2 {status = "okay";
};&i2c0 {status = "okay";vdd_cpu: tcs4525@1c {compatible = "tcs,tcs452x";reg = <0x1c>;vin-supply = <&vcc5v0_sys>;regulator-compatible = "fan53555-reg";regulator-name = "vdd_cpu";regulator-min-microvolt = <712500>;regulator-max-microvolt = <1390000>;regulator-init-microvolt = <900000>;regulator-ramp-delay = <2300>;fcs,suspend-voltage-selector = <1>;regulator-boot-on;regulator-always-on;regulator-state-mem {regulator-off-in-suspend;};};rk809: pmic@20 {compatible = "rockchip,rk809";reg = <0x20>;interrupt-parent = <&gpio0>;interrupts = <3 IRQ_TYPE_LEVEL_LOW>;pinctrl-names = "default", "pmic-sleep","pmic-power-off", "pmic-reset";pinctrl-0 = <&pmic_int>;pinctrl-1 = <&soc_slppin_slp>, <&rk817_slppin_slp>;pinctrl-2 = <&soc_slppin_gpio>, <&rk817_slppin_pwrdn>;pinctrl-3 = <&soc_slppin_gpio>, <&rk817_slppin_rst>;rockchip,system-power-controller;wakeup-source;#clock-cells = <1>;clock-output-names = "rk808-clkout1", "rk808-clkout2";//fb-inner-reg-idxs = <2>;/* 1: rst regs (default in codes), 0: rst the pmic */pmic-reset-func = <0>;/* not save the PMIC_POWER_EN register in uboot */not-save-power-en = <1>;vcc1-supply = <&vcc3v3_sys>;vcc2-supply = <&vcc3v3_sys>;vcc3-supply = <&vcc3v3_sys>;vcc4-supply = <&vcc3v3_sys>;vcc5-supply = <&vcc3v3_sys>;vcc6-supply = <&vcc3v3_sys>;vcc7-supply = <&vcc3v3_sys>;vcc8-supply = <&vcc3v3_sys>;vcc9-supply = <&vcc3v3_sys>;pwrkey {status = "okay";};pinctrl_rk8xx: pinctrl_rk8xx {gpio-controller;#gpio-cells = <2>;rk817_slppin_null: rk817_slppin_null {pins = "gpio_slp";function = "pin_fun0";};rk817_slppin_slp: rk817_slppin_slp {pins = "gpio_slp";function = "pin_fun1";};rk817_slppin_pwrdn: rk817_slppin_pwrdn {pins = "gpio_slp";function = "pin_fun2";};rk817_slppin_rst: rk817_slppin_rst {pins = "gpio_slp";function = "pin_fun3";};};regulators {vdd_logic: DCDC_REG1 {regulator-always-on;regulator-boot-on;regulator-min-microvolt = <500000>;regulator-max-microvolt = <1350000>;regulator-init-microvolt = <900000>;regulator-ramp-delay = <6001>;regulator-initial-mode = <0x2>;regulator-name = "vdd_logic";regulator-state-mem {regulator-off-in-suspend;};};vdd_gpu: DCDC_REG2 {regulator-always-on;regulator-boot-on;regulator-min-microvolt = <500000>;regulator-max-microvolt = <1350000>;regulator-init-microvolt = <900000>;regulator-ramp-delay = <6001>;regulator-initial-mode = <0x2>;regulator-name = "vdd_gpu";regulator-state-mem {regulator-off-in-suspend;};};vcc_ddr: DCDC_REG3 {regulator-always-on;regulator-boot-on;regulator-initial-mode = <0x2>;regulator-name = "vcc_ddr";regulator-state-mem {regulator-on-in-suspend;};};vdd_npu: DCDC_REG4 {regulator-always-on;regulator-boot-on;regulator-min-microvolt = <500000>;regulator-max-microvolt = <1350000>;regulator-init-microvolt = <900000>;regulator-ramp-delay = <6001>;regulator-initial-mode = <0x2>;regulator-name = "vdd_npu";regulator-state-mem {regulator-off-in-suspend;};};vdda0v9_image: LDO_REG1 {regulator-boot-on;regulator-always-on;regulator-min-microvolt = <900000>;regulator-max-microvolt = <900000>;regulator-name = "vdda0v9_image";regulator-state-mem {regulator-off-in-suspend;};};vdda_0v9: LDO_REG2 {regulator-always-on;regulator-boot-on;regulator-min-microvolt = <900000>;regulator-max-microvolt = <900000>;regulator-name = "vdda_0v9";regulator-state-mem {regulator-off-in-suspend;};};vdda0v9_pmu: LDO_REG3 {regulator-always-on;regulator-boot-on;regulator-min-microvolt = <900000>;regulator-max-microvolt = <900000>;regulator-name = "vdda0v9_pmu";regulator-state-mem {regulator-on-in-suspend;regulator-suspend-microvolt = <900000>;};};vccio_acodec: LDO_REG4 {regulator-always-on;regulator-boot-on;regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;regulator-name = "vccio_acodec";regulator-state-mem {regulator-off-in-suspend;};};vccio_sd: LDO_REG5 {regulator-always-on;regulator-boot-on;regulator-min-microvolt = <1800000>;regulator-max-microvolt = <3300000>;regulator-name = "vccio_sd";regulator-state-mem {regulator-off-in-suspend;};};vcc3v3_pmu: LDO_REG6 {regulator-always-on;regulator-boot-on;regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;regulator-name = "vcc3v3_pmu";regulator-state-mem {regulator-on-in-suspend;regulator-suspend-microvolt = <3300000>;};};vcca_1v8: LDO_REG7 {regulator-always-on;regulator-boot-on;regulator-min-microvolt = <1800000>;regulator-max-microvolt = <1800000>;regulator-name = "vcca_1v8";regulator-state-mem {regulator-off-in-suspend;};};vcca1v8_pmu: LDO_REG8 {regulator-always-on;regulator-boot-on;regulator-min-microvolt = <1800000>;regulator-max-microvolt = <1800000>;regulator-name = "vcca1v8_pmu";regulator-state-mem {regulator-on-in-suspend;regulator-suspend-microvolt = <1800000>;};};vcca1v8_image: LDO_REG9 {regulator-always-on;regulator-boot-on;regulator-min-microvolt = <1800000>;regulator-max-microvolt = <1800000>;regulator-name = "vcca1v8_image";regulator-state-mem {regulator-off-in-suspend;};};vcc_1v8: DCDC_REG5 {regulator-always-on;regulator-boot-on;regulator-min-microvolt = <1800000>;regulator-max-microvolt = <1800000>;regulator-name = "vcc_1v8";regulator-state-mem {regulator-off-in-suspend;};};vcc_3v3: SWITCH_REG1 {regulator-always-on;regulator-boot-on;regulator-name = "vcc_3v3";regulator-state-mem {regulator-off-in-suspend;};};vcc3v3_sd: SWITCH_REG2 {regulator-always-on;regulator-boot-on;regulator-name = "vcc3v3_sd";regulator-state-mem {regulator-off-in-suspend;};};};};
};&pmu_io_domains {status = "okay";pmuio2-supply = <&vcc3v3_pmu>;vccio1-supply = <&vccio_acodec>;vccio3-supply = <&vccio_sd>;vccio4-supply = <&vcc_1v8>;vccio5-supply = <&vcc_3v3>;vccio6-supply = <&vcc_1v8>;vccio7-supply = <&vcc_3v3>;
};&pinctrl {pmic {pmic_int: pmic_int {rockchip,pins =<0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>;};soc_slppin_gpio: soc_slppin_gpio {rockchip,pins =<0 RK_PA2 RK_FUNC_GPIO &pcfg_output_low_pull_down>;};soc_slppin_slp: soc_slppin_slp {rockchip,pins =<0 RK_PA2 1 &pcfg_pull_up>;};soc_slppin_rst: soc_slppin_rst {rockchip,pins =<0 RK_PA2 2 &pcfg_pull_none>;};};
};
  • 修改 arch/arm/dts/rockchip-pinconf.dtsi,增加一些 引脚相关的定义

在这里插入图片描述

  • 以上修改,可以参考 Linux kernel 中开发板设备树获取

验证

  • 经过完善 u-boot 下开发板设备树, rk3568 u-boot gmac 网络功能正常了,也不再依赖 Linux 内核的设备树,不再依赖 resouce 分区,可以单独编译并正常工作了

小结

  • 默认使用 rockchip 提供的 u-boot,通过读取 resouce 分区的Linux 设备树,可以正常的工作,如果想去掉这个依赖,需要 u-boot 关闭 resouce 分区,并且完善 u-boot 下的设备树,当前网络部分无法 ping 通问题主要是 缺少 rk809 电源管理 pmic 的配置

  • 通过不断摸搜,虽然没有写什么代码,只是更改了一些配置,让 RK3568 平台的 u-boot 回归到了原有的样子,去除了一些 rockchip 定制化的选项,可能这样做意义不是很大,不过有兴趣的可以尝试,比如自定义分区,不需要定义过多的额外的 resouce 等分区。

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

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

相关文章

STM32F1之FLASH闪存

目录 1. 简介 2. 闪存模块组织 3. FLASH基本结构 4. FLASH解锁 5. 使用指针访问存储器 6. 程序存储器全擦除 7. 程序存储器页擦除 8. 程序存储器编程 9. 选项字节 1. 简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分&#xff0c;通过…

【Android】Android应用性能优化总结

AndroidApp应用性能优化总结 最近大半年的时间里&#xff0c;大部分投在了某国内新能源汽车的某款AndroidApp开发上。 由于该App是该款车上&#xff0c;常用重点应用。所以车厂对应用性能的要求比较高。 主要包括&#xff1a; 应用冷启动达到***ms。应用热(温)启动达到***ms应…

RK3568笔记二十四:基于Flask的网页监控系统

若该文为原创文章&#xff0c;转载请注明原文出处。 此实验参考 《鲁班猫监控检测》&#xff0c;原代码有点BUG&#xff0c;已经下载不了。2. 鲁班猫监控检测 — [野火]嵌入式AI应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com) 一、简介 记录简单的摄像头监…

易语言IDE界面美化支持库

易语言IDE界面美化支持库 下载下来可以看到&#xff0c;是一个压缩包。 那么&#xff0c;怎么安装到易语言中呢&#xff1f; 解压之后&#xff0c;得到这两个文件。 直接将clr和lib丢到易语言安装目录中&#xff0c;这样子就安装完成了。 打开易语言&#xff0c;在支持库配置…

在营销的世界,你一定要记住:营满,则销

营销的世界中,有一个非常重要的一件事,这几个字一定要记住: 营满,则销;营未满,则不销。 你有没有把握,这是一个没办法可以复杂的东西,真得看营销人的直觉,营跟销是独立的两件事,营在营势,销是自然而然的。这里, 什么样的客户,看到什么样的产品。会有什么样的抗…

HCIP的学习(11)

OSPF的LSA详解 LSA头部信息 ​ [r2]display ospf lsdb router 1.1.1.1----查看OSPF某一条LSA的详细信息&#xff0c;类型以及LS ID参数。 链路状态老化时间 指一条LSA的老化时间&#xff0c;即存在了多长时间。当一条LSA被始发路由器产生时&#xff0c;该参数值被设定为0之后…

32 OpenCV Harris角点检测

文章目录 cornerHarris 算子示例 角点检测 cornerHarris 算子 void cv::cornerHarris ( InputArray src,OutputArray dst,int blockSize,int ksize,double K,int borderType BORDER_DEFAULT) src:待检测Harris角点的输入图像&#xff0c;图像必须是CV 8U或者CV 32F的单通道…

Maven 在项目的 pom.xml 文件中 指定 阿里云的景象仓库

配置 在 项目的 pom.xml 文件中添加如下配置即可 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&…

【Unity】位图字体制作工具:蒲公英

一般来讲&#xff0c;如果需要制作位图字体&#xff0c;一般是使用 BMFont 这种第三方工具&#xff1a;BMFont - AngelCode.comhttp://www.angelcode.com/products/bmfont/ 然而这个工具对于非程序员来说&#xff0c;操作起来较为繁琐困难。每次美术修改了字体之后&…

【区块链】比特币架构

比特币架构 2009年1月&#xff0c;在比特币系统论文发表两个月之后&#xff0c;比特币系统正式运行并开放了源码&#xff0c;标志着比特币网络的正式诞生。通过其构建的一个公开透明、去中心化、防篡改的账本系统&#xff0c;比特币开展了一场规模空前的加密数字货币体验。在区…

C++手写协程项目(协程实现线程结构体、线程调度器定义,线程挂起、切换、恢复函数,模块测试)

协程结构体定义 之前我们使用linux下协程函数实现了线程切换&#xff0c;使用的是ucontext_t结构体&#xff0c;和基于这个结构体的四个函数。现在我们要用这些工具来实现我们自己的一个线程结构体&#xff0c;并实现线程调度和线程切换、挂起。 首先我们来实现以下线程结构体…

Linux常用软件安装(JDK、MySQL、Tomcat、Redis)

目录 一、上传与下载工具Filezilla1. filezilla官网 二、JDK安装1. 在opt中创建JDK目录2.上传JDK压缩文件到新建目录中3.卸载系统自代jdk4.安装JDK5.JDK环境变量配置6. 验证是否安装成功 三、安装MySQL1.创建mysql文件夹2.下载mysql安装压缩包3.上传到文件夹里面4. 卸载系统自带…

ThreeJS:光线投射与3D场景交互

光线投射Raycaster 光线投射详细介绍可参考&#xff1a;https://en.wikipedia.org/wiki/Ray_casting&#xff0c; ThreeJS中&#xff0c;提供了Raycaster类&#xff0c;用于进行鼠标拾取&#xff0c;即&#xff1a;当三维场景中鼠标移动时&#xff0c;利用光线投射&#xff0c;…

SpringCloudAlibaba:4.1云原生网关higress的搭建

概述 简介 Higress是基于阿里内部的Envoy Gateway实践沉淀、以开源Istio Envoy为核心构建的下一代云原生网关&#xff0c; 实现了流量网关 微服务网关 安全网关三合一的高集成能力&#xff0c;深度集成Dubbo、Nacos、Sentinel等微服务技术栈 定位 在虚拟化时期的微服务架构…

【DevOps】Jenkins 集成Docker

目录 1. 安装 Docker 和 Jenkins 2. 在 Jenkins 中安装 Docker 插件 3. 配置 Docker 连接 4. 创建 Jenkins Pipeline 5. 示例 Pipeline 脚本 6. 运行 Jenkins Job 7. 扩展功能 8、docker配置测试连接的时候报错处理 将 Docker 与 Jenkins 集成可以实现持续集成和持续交…

目标检测正负样本区分和平衡

1、正负样本定义 rpn和rcnn的正负样本定义都是基于MaxIoUAssigner&#xff0c;只不过定义阈值不一样而已。 MaxIoUAssigner的操作包括4个步骤&#xff1a; 首先初始化时候假设每个anchor的mask都是-1&#xff0c;表示都是忽略anchor 将每个anchor和所有gt的iou的最大Iou小于…

如何为 Nestjs 编写单元测试和 E2E 测试

前言 最近在给一个 nestjs 项目写单元测试&#xff08;Unit Testing&#xff09;和 e2e 测试&#xff08;End-to-End Testing&#xff0c;端到端测试&#xff0c;简称 e2e 测试&#xff09;&#xff0c;这是我第一次给后端项目写测试&#xff0c;发现和之前给前端项目写测试还…

Rust里的Fn/FnMut/FnOnce和闭包匿名函数关系

闭包&#xff08;英语&#xff1a;Closure&#xff09;&#xff0c;又称词法闭包&#xff08;Lexical Closure&#xff09;或函数闭包&#xff08;function closures&#xff09;&#xff0c;是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在&#xff0c;即使…

Linux线程安全,互斥量和条件变量

文章目录 一、 Linux线程互斥1. 进程线程间的互斥相关背景概念&#xff08;1&#xff09; 临界资源和临界区&#xff08;2&#xff09; 互斥和原子性 2. 互斥量mutex3. 互斥量的接口4. 互斥量实现原理探究 二、 可重入VS线程安全1. 概念2. 常见的线程不安全的情况3. 常见的线程…

【superset】基于MySQL的BI数据分析可视化实战案例(已更新)

1.熟悉、梳理、总结下superset可视化分析实战案例知识体系,一直想探索有效可用的可视化分析方案,大多收费或不好用,这里,借此机会总结、更新下。 2.复杂度高,遇到并解决的问题较多,尝试了很多次。 3.欢迎批评指正,跪谢一键三连! 基于MySQL的BI数据分析可视化实战案例文…