Linux驱动之系统移植----uboot移植(有设备树版本),完整移植.

2023-11-01

uboot版本:uboot2020.04
开发板:100ask_imx6ull_pro

拿到官方uboot后第一步先编译烧写测试, 查看哪些驱动可用, 哪些不可用.
根据开发板厂商提供的资料:
使用mx6ull_14x14_evk_defconfig配置进行修改
编译完成后将uboot设备树以及uboot.imx烧写到开发板中运行


CPU:   i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 40C
Reset cause: POR
Model: i.MX6 ULL 14x14 EVK Board
Board: MX6ULL 14x14 EVK
DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... *** Warning - bad CRC, using default environment

[*]-Video Link 0 (480 x 272)
        [0] lcdif@21c8000, video
In:    serial
Out:   serial
Err:   serial
switch to partitions #0, OK
mmc1(part 0) is current device
flash target is MMC:1
Net:
Error: ethernet@20b4000 address not set.

Error: ethernet@20b4000 address not set.

Error: ethernet@20b4000 address not set.
FEC: can't find phy-handle

Error: ethernet@20b4000 address not set.
Could not get PHY for FEC0: addr 2

Error: ethernet@20b4000 address not set.
FEC: can't find phy-handle

Error: ethernet@20b4000 address not set.
Could not get PHY for FEC0: addr 2
No ethernet found.

显然网络不通, phy无法找到, 其次LCD需要关闭(uboot启动阶段非必要驱动LCD)

一, 添加自定义板子

参考文章官方uboot添加自定义板子
备注:
uboot2020的图形界面配置文件在 arch/arm/mach-imx/mx6
全局搜索TARGET_MX6ULL_14X14_EVK找到的

二, 关闭LCD

在mx6ull_jzy_defconfig文件中

删除 CONFIG_DM_VIDEO=y

因为在mx6ull_jzy.c文件中有lcd的初始化函数: setup_lcd(void);有个编译选项为CONFIG_DM_VIDEO, 搜索这个就可以得到是在mx6ull_jzy_defconfig中定义了

三, 在设备树中修改网络驱动

官板与开发板的硬件原理图对比
由于开发板更换了官板的phy芯片所以需要修改PHY芯片配置
在mx6ull_jzy.c文件中找到网络驱动相关的函数:
static int setup_fec(void)


#ifdef CONFIG_FEC_MXC
static int setup_fec(void)
{
	struct iomuxc *const iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR;
	int ret;

	/*
	 * Use 50M anatop loopback REF_CLK1 for ENET1,
	 * clear gpr1[13], set gpr1[17].
	 */
	clrsetbits_le32(&iomuxc_regs->gpr[1], IOMUX_GPR1_FEC1_MASK,
			IOMUX_GPR1_FEC1_CLOCK_MUX1_SEL_MASK);
	/*
	 * Use 50M anatop loopback REF_CLK2 for ENET2,
	 * clear gpr1[14], set gpr1[18].
	 */
	if (!check_module_fused(MX6_MODULE_ENET2)) {
		clrsetbits_le32(&iomuxc_regs->gpr[1], IOMUX_GPR1_FEC2_MASK,
				IOMUX_GPR1_FEC2_CLOCK_MUX1_SEL_MASK);
	}

	ret = enable_fec_anatop_clock(0, ENET_50MHZ);
	if (ret)
		return ret;

	if (!check_module_fused(MX6_MODULE_ENET2)) {
		ret = enable_fec_anatop_clock(1, ENET_50MHZ);
		if (ret)
			return ret;
	}

	enable_enet_clk(1);

	return 0;
}

int board_phy_config(struct phy_device *phydev)
{
	phy_write(phydev, MDIO_DEVAD_NONE, 0x1f, 0x8190);

	if (phydev->drv->config)
		phydev->drv->config(phydev);

	return 0;
}
#endif

被CONFIG_FEC_MXC宏定义包含, 在mx6ull_jzy_defconfig中搜索得到:
CONFIG_FEC_MXC=y
已经开启.

由于开发板使用了LAN8720的PHY芯片,
在mx6ull_jzy_defconfig把
CONFIG_PHY_MICREL=y
CONFIG_PHY_MICREL_KSZ8XXX=y
这两个删除, 替换成
CONFIG_PHY_SMSC=y

因为在drivers/net/phy/Makefile中定义了一系列编译选项

# SPDX-License-Identifier: GPL-2.0+
#
# (C) Copyright 2008
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.

obj-$(CONFIG_BITBANGMII) += miiphybb.o
obj-$(CONFIG_B53_SWITCH) += b53.o
obj-$(CONFIG_MV88E61XX_SWITCH) += mv88e61xx.o
obj-$(CONFIG_MV88E6352_SWITCH) += mv88e6352.o

obj-$(CONFIG_PHYLIB) += phy.o
obj-$(CONFIG_PHYLIB_10G) += generic_10g.o
obj-$(CONFIG_PHY_AQUANTIA) += aquantia.o
obj-$(CONFIG_PHY_ATHEROS) += atheros.o
obj-$(CONFIG_PHY_BROADCOM) += broadcom.o
obj-$(CONFIG_PHY_CORTINA) += cortina.o
obj-$(CONFIG_PHY_DAVICOM) += davicom.o
obj-$(CONFIG_PHY_ET1011C) += et1011c.o
obj-$(CONFIG_PHY_LXT) += lxt.o
obj-$(CONFIG_PHY_MARVELL) += marvell.o
obj-$(CONFIG_PHY_MICREL_KSZ8XXX) += micrel_ksz8xxx.o
obj-$(CONFIG_PHY_MICREL_KSZ90X1) += micrel_ksz90x1.o
obj-$(CONFIG_PHY_MESON_GXL) += meson-gxl.o
obj-$(CONFIG_PHY_NATSEMI) += natsemi.o
obj-$(CONFIG_PHY_REALTEK) += realtek.o
obj-$(CONFIG_PHY_SMSC) += smsc.o
obj-$(CONFIG_PHY_TERANETICS) += teranetics.o
obj-$(CONFIG_PHY_TI) += dp83867.o
obj-$(CONFIG_PHY_XILINX) += xilinx_phy.o
obj-$(CONFIG_PHY_XILINX_GMII2RGMII) += xilinx_gmii2rgmii.o
obj-$(CONFIG_PHY_VITESSE) += vitesse.o
obj-$(CONFIG_PHY_MSCC) += mscc.o
obj-$(CONFIG_PHY_FIXED) += fixed.o
obj-$(CONFIG_PHY_NCSI) += ncsi.o

跳转到smsc.c中发现开发板所用的芯片的定义:

static struct phy_driver lan8710_driver = {
	.name = "SMSC LAN8710/LAN8720",
	.uid = 0x0007c0f0,
	.mask = 0xffff0,
	.features = PHY_BASIC_FEATURES,
	.config = &genphy_config_aneg,
	.startup = &genphy_startup,
	.shutdown = &genphy_shutdown,
};

修改设备树

第一步确定PHY芯片地址
mx6ull_jzy_defconfig中定义了
CONFIG_DEFAULT_DEVICE_TREE=“imx6ull-14x14-evk”
使用设备树imx6ull-14x14-evk
打开imx6ull-14x14-evk.dts

#include "imx6ull.dtsi"
#include "imx6ul-14x14-evk.dtsi"
#include "imx6ul-14x14-evk-u-boot.dtsi"

包含了三个dtsi, 全部打开, 并搜索phy关键字
在imx6ul-14x14-evk.dtsi中找到fec1和fec2的描述

&fec1 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet1>;
	phy-mode = "rmii";
	phy-handle = <&ethphy0>;
	status = "okay";
};

&fec2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet2>;
	phy-mode = "rmii";
	phy-handle = <&ethphy1>;
	status = "okay";

	mdio {
		#address-cells = <1>;
		#size-cells = <0>;

		ethphy0: ethernet-phy@2 {
			reg = <2>;
			micrel,led-mode = <1>;
			clocks = <&clks IMX6UL_CLK_ENET_REF>;
			clock-names = "rmii-ref";
		};

		ethphy1: ethernet-phy@1 {
			reg = <1>;
			micrel,led-mode = <1>;
			clocks = <&clks IMX6UL_CLK_ENET2_REF>;
			clock-names = "rmii-ref";
		};
	};
};

然而其标签是&fec2说明这并不是最初的源头, 我们需要找到对饮的节点的驱动程序, 最好的办法就是fec2的compatible属性的定义
通过追溯所有imx6ull-14x14-evk.dts包含的设备树, 找到imx6ul.dtsi中描述了fec2


			fec2: ethernet@20b4000 {
				compatible = "fsl,imx6ul-fec", "fsl,imx6q-fec";
				reg = <0x020b4000 0x4000>;
				interrupt-names = "int0", "pps";
				interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
					     <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
				clocks = <&clks IMX6UL_CLK_ENET>,
					 <&clks IMX6UL_CLK_ENET_AHB>,
					 <&clks IMX6UL_CLK_ENET_PTP>,
					 <&clks IMX6UL_CLK_ENET2_REF_125M>,
					 <&clks IMX6UL_CLK_ENET2_REF_125M>;
				clock-names = "ipg", "ahb", "ptp",
					      "enet_clk_ref", "enet_out";
				fsl,num-tx-queues=<1>;
				fsl,num-rx-queues=<1>;
				status = "disabled";
			};

通过搜索 fsl,imx6ul-fec 这个关键字可以找到驱动程序

找到了drivers/net/fec_mxc.c中

static const struct udevice_id fecmxc_ids[] = {
	{ .compatible = "fsl,imx28-fec" },
	{ .compatible = "fsl,imx6q-fec" },
	{ .compatible = "fsl,imx6sl-fec" },
	{ .compatible = "fsl,imx6sx-fec" },
	{ .compatible = "fsl,imx6ul-fec" },
	{ .compatible = "fsl,imx53-fec" },
	{ .compatible = "fsl,imx7d-fec" },
	{ .compatible = "fsl,mvf600-fec" },
	{ .compatible = "fsl,imx8qm-fec" },
	{ }
};

U_BOOT_DRIVER(fecmxc_gem) = {
	.name	= "fecmxc",
	.id	= UCLASS_ETH,
	.of_match = fecmxc_ids,
	.ofdata_to_platdata = fecmxc_ofdata_to_platdata,
	.probe	= fecmxc_probe,
	.remove	= fecmxc_remove,
	.ops	= &fecmxc_ops,
	.priv_auto_alloc_size = sizeof(struct fec_priv),
	.platdata_auto_alloc_size = sizeof(struct eth_pdata),
};

在device_get_phy_addr函数中发现获取phy地址, 读取的是phy-handle属性中的reg的第0个描述

static int device_get_phy_addr(struct udevice *dev)
{
	struct ofnode_phandle_args phandle_args;
	int reg;

	if (dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0,
				       &phandle_args)) {
		debug("Failed to find phy-handle");
		return -ENODEV;
	}

	reg = ofnode_read_u32_default(phandle_args.node, "reg", 0);

	return reg;
}

fec2的reg第0个描述是0x1.无需修改

第二步对PHY芯片进行硬复位, 即对复位引脚进行操作
在drivers/net/fec_mxc.c中的fecmxc_probe函数中是有复位函数调用的:

static int fecmxc_probe(struct udevice *dev)
{
...
#if CONFIG_IS_ENABLED(DM_GPIO)
	fec_gpio_reset(priv);
#endif
...
}

CONFIG_IS_ENABLED(DM_GPIO)这个宏表示
CONFIG_DM_GPIO是否使能了

查看fec_gpio_reset(priv);函数

/* FEC GPIO reset */
static void fec_gpio_reset(struct fec_priv *priv)
{
	debug("fec_gpio_reset: fec_gpio_reset(dev)\n");
	if (dm_gpio_is_valid(&priv->phy_reset_gpio)) {
		dm_gpio_set_value(&priv->phy_reset_gpio, 1);
		mdelay(priv->reset_delay);
		dm_gpio_set_value(&priv->phy_reset_gpio, 0);
		if (priv->reset_post_delay)
			mdelay(priv->reset_post_delay);
	}
}

dm_gpio_is_valid(&priv->phy_reset_gpio)知道 如果phy_reset_gpio是有效的才会进入初始化.
搜索phy_reset_gpio找到:

	ret = gpio_request_by_name(dev, "phy-reset-gpios", 0,
				   &priv->phy_reset_gpio, GPIOD_IS_OUT);

原来是通过读取设备树中的phy-reset-gpios这个属性, 因此,需要加这个属性.
回到imx6ul-14x14-evk.dtsi文件,
在&fec2中添加属性phy-reset-gpios = <&gpio5 6 GPIO_ACTIVE_LOW>;
模仿spi4节点中的pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;来写的;
初始化的过程还有用到reset_delay这个变量, 搜索得到
priv->reset_delay = dev_read_u32_default(dev, “phy-reset-duration”, 1);
是这么来, 所以要添加phy-reset-duration属性, 值在LAN8720芯片手册中说明, 初始化引脚要保持25以上, 因此设置phy-reset-duration = <26>;

&fec2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet2>;
	phy-mode = "rmii";
	phy-handle = <&ethphy1>;
	phy-reset-gpios = <&gpio5 6 GPIO_ACTIVE_LOW>;
	phy-reset-duration = <26>;
	status = "okay";

	mdio {
		#address-cells = <1>;
		#size-cells = <0>;

		ethphy0: ethernet-phy@2 {
			reg = <2>;
			micrel,led-mode = <1>;
			clocks = <&clks IMX6UL_CLK_ENET_REF>;
			clock-names = "rmii-ref";
		};

		ethphy1: ethernet-phy@1 {
			reg = <1>;
			micrel,led-mode = <1>;
			clocks = <&clks IMX6UL_CLK_ENET2_REF>;
			clock-names = "rmii-ref";
		};
	};
};

在设备树中加上 gpio5-6的初始化.
找到合适的位置添加:
MX6ULL_PAD_SNVS_TAMPER6__GPIO5_IO06 0x79
只要会被调用的地方都可以
pinctrl_enet2是要使用的,必然会被调用.

	pinctrl_enet2: enet2grp {
		fsl,pins = <
			MX6UL_PAD_GPIO1_IO07__ENET2_MDC		0x1b0b0
			MX6UL_PAD_GPIO1_IO06__ENET2_MDIO	0x1b0b0
			MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN	0x1b0b0
			MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER	0x1b0b0
			MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00	0x1b0b0
			MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01	0x1b0b0
			MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN	0x1b0b0
			MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00	0x1b0b0
			MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01	0x1b0b0
			MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2	0x4001b031
			MX6ULL_PAD_SNVS_TAMPER6__GPIO5_IO06 0x79
		>;
	};

第三步添加PHY芯片的软复位驱动代码
软复位就是将LAN8720芯片中的复位寄存器设置
打开drivers/net/phy/phy.c b/drivers/net/phy/phy.c
这个是phy芯片的通用驱动
参考文章对drivers/net/phy/phy.c 的修改

烧录测试网卡

=> setenv eth1addr 00:01:3f:2d:3e:4d
=> setenv ipaddr 192.168.31.178
=> setenv gatewayip 192.168.31.1
=> setenv netmask 255.255.255.0
=> setenv serverip 192.168.31.158
=> saveenv
=> ping 192.168.31.158
ethernet@20b4000 Waiting for PHY auto negotiation to complete.... done
Using ethernet@20b4000 device
host 192.168.31.158 is alive

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux驱动之系统移植----uboot移植(有设备树版本),完整移植. 的相关文章

  • STM32 CAN通信理解(是半双工还是全双工?)

    STM32F429 CAN通信 CAN 是控制器局域网络 Controller Area Network 的简称 它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的 并最终成为国际标准 ISO11519 是国际上应用最广泛的现场
  • verilog奇数分频器的问题讲解(7分频为例)

    先不多哔哔 直接上代码 verilogHDL 代码的后面讲原理 module fenpin3 clk clk7 rst input clk rst 设置rst的目的是当rst 1的时候给cnt0和cnt1赋初值 output clk7 re
  • 基于STM32F4单片机对步进电机的控制(有代码)

    步进电机简介 步进电机是将电脉冲控制信号转变为角位移或线位移的一种常用的数字控制执行元件 又称为脉冲电机 在驱动电源的作用下 步进电机受到脉冲的控制 其转子的角位移量和速度严格地与输入脉冲的数量和脉冲频率成正比 步进电机每接收一个电脉冲 转
  • C++实现FFT频谱分析

    Update 9 10 2022 鸽了太久 增补了一些新的表述和简单推导 以及FFT在算法竞赛中的应用部分 帖子里的代码已经分别在2021全国大学生电子设计竞赛 洛谷OJ和课程设计中实战过 可靠性有保障 Origin 10 23 2021
  • LCD背光调节实验

    目录 LCD 背光调节简介 硬件原理分析 实验程序编写 编译下载验证 编写Makefile 和链接脚本 编译下载 不管是使用显示器还是手机 其屏幕背光都是可以调节的 通过调节背光就可以控制屏幕的亮度 在户外阳光强烈的时候可以通过调高背光来看
  • 树莓派4B安装详细教程,从零开始!

    树莓派4B安装详细教程 从零开始 前言 一 准备材料 1 硬件材料 2 软件材料 二 安装步骤 1 格式化SD卡 2 安装系统 三 安装完成 前言 提示 本文详细介绍树莓派4B的安装流程 适合刚入手树莓派的同学 认为我写的好的同学希望点赞关
  • 主线剧情0.0-Linux学习资源大综合

    Linux 学习资源大综合 对收集到的比较丰富的 Linux 学习相关的资料进行整理 注 如果链接挂了请告诉我 如果链接里的内容被删了那么直接搜文章名字试试也许会搜出来很多转载的 备份 注 在 Github 上的原版文章日后可能会更新 在其
  • 内存管理实验

    内存管理 1 介绍 内存管理 是指软件运行时对计算机内存资源的分配和使用的技术 其最主要的目的是如何高效 快速的分配 并且在适当的时候释放和回收内存资源 内存管理的实现方法有很多种 他们其实最终都是要实现 2 个函数 malloc 和 fr
  • <Linux开发>驱动开发 -之- Linux LCD 驱动

    Linux开发 驱动开发 之 Linux LCD 驱动 交叉编译环境搭建 Linux开发 linux开发工具 之 交叉编译环境搭建 uboot移植可参考以下 Linux开发 之 系统移植 uboot移植过程详细记录 第一部分 Linux开发
  • 步进电机基础(5.6)-步进电机的驱动与控制-闭环控制

    步进电机基础 5 6 步进电机的驱动与控制 闭环控制 前言 基本信息 前言说明 5 6 闭环控制 前言 基本信息 名称 描述说明 教材名称 步进电机应用技术 作者 坂本正文 译者 王自强 前言说明 根据我读的 步进电机应用技术 这本书 进行
  • 毕业设计 STM32人体红外测温枪温度采集系统 - 单片机

    文章目录 1 前言 2 主要器件 3 实现效果 4 设计原理 MLX90614 红外温度传感器 5 部分实现代码 6 最后 1 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求
  • 为何在新建STM工程中全局声明两个宏

    在uVision中新建STM32工程后 需要从STM32标准库中拷贝标准外设驱动到自己的工程目录中 此时需要在工程设置 gt C C 选项卡下的Define文本框中键入这两个全局宏定义 STM32F40 41xxx USE STDPERIP
  • STM32CubeMX HAL库串口+DMA+IDLE空闲中断不定长度数据接收和发送

    本文开发环境 MCU型号 STM32F103ZET6 IDE环境 MDK 5 29 代码生成工具 STM32CubeMx 5 3 0 HAL库版本 STM32Cube FW F1 V1 8 0 STM32Cube MCU Package f
  • 深入分析linux内核的内存分配函数devm_kzalloc

    在分析驱动代码的时候 经常会遇到使用devm kzalloc 为一个设备分配一片内存的情况 devm kzalloc 是内核用来分配内存的函数 同样可以分配内存的内核函数还有devm kmalloc kzalloc kmalloc 它们之间
  • linux使用文件描述符0、1和2来处理输入和输出

    文件描述符012 在Linux中 文件描述符0 1和2分别代表标准输入 stdin 标准输出 stdout 和标准错误 stderr 它们用于处理进程的输入和输出 文件描述符0 stdin 文件描述符0是进程的标准输入 通常用于读取用户的输
  • Java的引用类型有几种?区别是什么?

    nbsp Java的引用类型有几种 区别是什么 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复
  • Java语言真的跌落神坛了吗?

    Java语言真的跌落神坛了吗 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复 888 即可拿走
  • 锂电池管理系统(BMS)

    引言 在现代科技的推动下 锂电池已经成为各种电动设备和能源存储系统的首选能源媒介 然而 锂电池在充电和放电过程中存在一系列潜在的安全隐患 同时其性能和寿命也受到一些限制 为了解决这些问题 锂电池管理系统 BMS 应运而生 BMS不仅仅是一个
  • OpenHarmony基于HDF简单驱动开发实例

    背景 OpenHarmony 3 0 LTS qemu small system demo liteos a qemu 添加配置 device qemu arm virt liteos a hdf config device info de
  • 【学习分享】全志平台TWI子系统源码分析(1)从设备树到寄存器

    全志平台TWI子系统源码分析 1 从设备树到寄存器 前言 一 名词解释 二 从设备树入手看源码 1 TWI设备树 2 TWI源码位置 3 TWI总线相关寄存器 总结 前言 这次开坑主要是想把全志平台TWI子系统在源

随机推荐

  • Android倒计时控制

    摘要 目前android 中实现倒计时功能的几种方式 Timer handler xxx AlarmManager 前俩种的实现方式在系统休眠状态下也会被休眠 由此产生不准确的问题发生 这里主要介绍第三种实现方式 大致原理 在手机中主要存在
  • 深度学习--实现线性单元--以根据一个人的工作年限来预测他的工作收入为例

    在上一篇中 已经介绍了简单感知器的实现点此查看 感知器的模型和线性单元除了激活函数f不同之外 两者的模型和训练规则是一样的 这也说明在实现线性单元的代码中 可以复用实现简单感知器的代码 注 线性单元的激活函数为 f z z 本次代码环境是p
  • 信号的表示及可视化 基于matlab的信号设计方法研究

    二 实验内容 function x dwyz n x n 0 end ex1001 m 利用dwyz函数求解单位样值序列 需要先定义这样一个函数 n 4 4 x dwyz n stem n x filled grid on xlabel n
  • R语言实战笔记--第十一章 中级绘图之散点、气泡、相关、马赛克

    R语言实战笔记 第十一章 中级绘图之散点 气泡 相关 马赛克 标签 空格分隔 R语言 绘图方法 散点图 气泡图 相关图 马赛克图 R语言实战中的中级绘图包括了散点图 气泡图 拆线图 相关图和马赛克图 主要讲述的是二元和多元关系的图形表述 散
  • Seaborn绘制热力图的子图

    Seaborn绘制热力图的子图 提示 如何绘制三张子图 绘制的时候 会出现如下问题 1 如何绘制1 3的子图 2 三个显示条 如何只显示最后一个 提示 下面就展示详细步骤 Seaborn绘制热力图的子图 Seaborn绘制热力图的子图 前言
  • python自动化登录163邮箱发送邮件

    记录第一次自动化发送邮件成功 第一步 准备好 HTMLTestRunner py文件放在下面这个路径 第二步 创建 Mail163 yaml 存放信息 testURL http mail 163 com user1 username xxx
  • 手机拨出等待时间长_手机打不出去电话怎么回事 一分钟轻松排查原因

    近段时间 有网友询问 手机出现打不出电话的情况 这是咋回事呢 针对这个问题 我们罗列出了几种可能性 一起来看一下是什么造成这种情形的吧 具体方法 第一步 我们将手机重启 并且长按电源键几秒钟 重新开机 如果没有回应 就需要插拔电板 再开机
  • input上传视频并本地预览

  • 深入理解Flutter Platform Channel

    作者 闲鱼技术 皓黯 相信读者们在阅读了我们之前的文章后 对Platform Channel有了一定的理解和认识 但是由于篇幅有限 上文并未对Platform Channel的工作原理进行详细的讲解 Platform Channel如何工作
  • 探秘Linux下正确获取物理内存大小的方法与技巧

    探秘Linux下正确获取物理内存大小的方法与技巧 在Linux系统中 正确获取物理内存大小是一个非常重要的任务 物理内存大小是计算机系统性能和资源管理的关键指标之一 它直接影响到系统的稳定性和性能 在本教程中 我们将介绍几种方法和技巧 帮助
  • 计算机故障与日常维护论文,浅析计算机的日常维护与故障维修.pdf

    ISSN1009 3044 E mail kfyj ComputerKnowledgeandTechnology电脑知识与技术 第10卷第5期 2014年2月 ComputerKnowledgeandTechnology 电脑知识与技术 V
  • 【重识云原生】第三章云存储第一节——分布式云存储总述

    重识云原生系列 专题索引 第一章 不谋全局不足以谋一域 第二章计算第1节 计算虚拟化技术总述 第二章计算第2节 主流虚拟化技术之VMare ESXi 第二章计算第3节 主流虚拟化技术之Xen 第二章计算第4节 主流虚拟化技术之KVM 第二章
  • 关于小网站抄袭

    昨天 我在百度搜索自己的公众号里文章名字才发现 居然被一个小网站 女黑客导航 http www nvhacker com 2021 08 05 e7 a4 be e5 b7 a5 e5 9f ba e7 a1 802 抄袭了 我辛辛苦苦写的
  • centos7火狐浏览器上不了网_明明连上WiFi却上不了网?教你几种方法,让你永不断网...

    智能时代的崛起 wifi已经成为我们身边不可缺少的一部分 甚至就连上班的第一件事也从打开电脑变成了打开手机wifi阅览新闻 当然有时我们也碰到一些bug发生 就是已经连上了wifi 却不能正常的上网 甚至连网页都打不开 而今天小编就来说说这
  • Mac构建Protobuf

    Protobuf源码下载 https github com JumpWu xls2protobuf tree master protobuf V3 0 1 切换到protobuf V3 0 根目录 运行 autogen sh前 我们需要先安
  • 聊聊G1垃圾收集器

    作为一款高效的垃圾收集器 G1在JDK7中加入JVM 在JDK9中取代CMS成为了默认的垃圾收集器 1 垃圾收集器回顾 1 1 新生代 新生代采用复制算法 主要的垃圾收集器有三个 Serial Parallel New 和 Parallel
  • 深度可分离卷积的计算量

    深度可分离卷积将传统的卷积分解为一个深度卷积 depthwise convolution 一个 1 1的卷积 pointwise convolution 如下图所示 a 是传统卷积 b c 分别对应深度可分离卷积的深度卷积和 1 1的卷积
  • 如何放大matlab结果局部图

    如何放大matlab结果局部图 最近发现这个功能对于论文写作可以说是非常有帮助了 于是记录下来方便各位师兄或者师弟使用 也为了防止自己忘记 生成如下所示的结果 非常美观和加分 首先记得下载magnify文件 具体的magnify压缩包文件也
  • 【原创】CPU性能优化小记

    CPU性能优化小记 文章目录 CPU性能优化小记 一 现象 TOP各指标含义 二 分析 启动应用前 启动应用后 采集内核函数的方法 内核采集分析 火焰图分析 三 解决 一 现象 业务线反馈 单板只要一跑我们的通讯软件appA CPU就变得很
  • Linux驱动之系统移植----uboot移植(有设备树版本),完整移植.

    uboot版本 uboot2020 04 开发板 100ask imx6ull pro 拿到官方uboot后第一步先编译烧写测试 查看哪些驱动可用 哪些不可用 根据开发板厂商提供的资料 使用mx6ull 14x14 evk defconfi