Linux屏幕驱动开发调试笔记

news2024/10/5 10:07:29

引言

首先了解下什么是MIPI-DSI

MIPI-DSI是一种应用于显示技术的串行接口,兼容DPI(显示像素接口,Display Pixel Interface)、DBI(显示总线接口,Display Bus Interface)和DCS(显示命令集,Display Command Set),以串行的方式发送像素信息或指令给外设,而且从外设中读取状态信息或像素信息,而且在传输的过程中享有自己独立的通信协议,包括数据包格式和纠错检错机制。下图所示的是MIPI-DSI接口的简单示意图。MIPI-DSI具备高速模式和低速模式两种工作模式,全部数据通道都可以用于单向的高速传输,但只有第一个数据通道才可用于低速双向传输,从属端的状态信息、像素等格式通过该数据通道返回。时钟通道专用于在高速传输数据的过程中传输同步时钟信号。此外,一个主机端可允许同时与多个从属端进行通信。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么,在Linux中调试MIPI LCD需要注意哪些细节呢?

  • 供电
  • 复位
  • 时序
  • 像素时钟
  • MIPI时钟
  • MIPI命令
  • MIPI数据格式

参数解读(走马观花)

在Linux驱动开发过程中,一般通用的MIPI的驱动都是现成的,比如以下的simple-panel-dsi,就是通用的MIPI接口LCD驱动,它在Linux内核中位于driver/gpu/drm/panel目录下,对应的文件是:panel-simple.c

一般使用通用的MIPI LCD驱动,我们只需要根据自己选购的屏的参数进行配置即可,也就是只需要配置设备树即可顺利完成点屏的操作,那么如何来配置相关参数呢?这里我用的是瑞芯微的RV1109方案,在此借用荣品LCD的设备树我们来学习下它的设备树参数:

&dsi {
 status = "okay";

 rockchip,lane-rate = <480>;
 panel@0 {
  compatible ="simple-panel-dsi";
  reg = <0>;
  backlight = <&backlight>;
  /delete-property/ power-supply;
  prepare-delay-ms = <100>;
  reset-delay-ms = <10>;
  init-delay-ms = <100>;
  disable-delay-ms = <50>;
  unprepare-delay-ms = <20>;

  width-mm = <68>;
  height-mm = <121>;
  
  pinctrl-names = "default";
  pinctrl-0 = <&vdd_5v_3v3_h>;
  
  enable-gpios = <&gpio2 27 GPIO_ACTIVE_HIGH>;
  reset-gpios  = <&gpio3 4 GPIO_ACTIVE_LOW>;
  
  dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
         MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;
  dsi,format = <MIPI_DSI_FMT_RGB888>;
  dsi,lanes = <4>;

  panel-init-sequence = [
   05 78 01 11
   05 78 01 29
  ];

  display-timings {
   native-mode = <&timing0>;

   timing0: timing0 {
    clock-frequency = <51000000>;
    hactive = <1024>;
    vactive = <600>;
    hback-porch = <160>;
    hfront-porch = <136>;
    vback-porch = <16>;
    vfront-porch = <16>;
    hsync-len = <4>;
    vsync-len = <2>;
    hsync-active = <0>;
    vsync-active = <0>;
    de-active = <0>;
    pixelclk-active = <0>;
   };
  };

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

   port@0 {
    reg = <0>;
    panel_in_dsi: endpoint {
     remote-endpoint = <&dsi_out_panel>;
    };
   };
  };
 };

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

  port@1 {
   reg = <1>;
   dsi_out_panel: endpoint {
    remote-endpoint = <&panel_in_dsi>;
   };
  };
 };
};

上面提供了非常多的节点,但是怎么去理解这些节点呢??Linux内核为我们提供了丰富的文档:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有了这些文档,我们再来看上面设备树节点的内容就简单多了,当然我们也可以结合代码来理解这些参数的含义:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

举例说明

先列举一些重要的参数:

  1. enable-gpios和reset-gpios

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

enable-gpios配置的是LCD的使能脚,reset-gpios配置的是LCD的复位脚:

enable-gpios = <&gpio2 27 GPIO_ACTIVE_HIGH>;
reset-gpios  = <&gpio3 4 GPIO_ACTIVE_LOW>;

如上所示,为什么是27和4,我们要查询下IO口绑定的编号,如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. hactive, vactive

表示显示分辨率,在设备树里一般如下表示:

hactive = <1024>;  //水平分辨率
vactive = <600>;   //垂直分辨率

跟分辨率相关的内容我们一般都可以从LCD厂家提供的数据手册里找到它们:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. dsi,lanes

确定接口类型为MIPI,MIPI能够实现多通道差分传输,所以通过数据手册我们可以了解它具体有多少路:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据数据手册,我们很容易了解到数据通道有4组,所以对应设备树中的配置如下:

dsi,lanes = <4>; //表示使用 4lane 传输数据
  1. 时序

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一般厂家FAE会给到我们一组参数,分别是:

lane个数(与原理图匹配)
HSA、HBP、HACT、HFP
VSA、VBP、VACT、VFP
FR
pixel_clk (KHZ)
phy_data_rate (Mbps)

其中参考了网上的一些计算公式:
(1)HBB = HSA + HBP
(2)VBB = VSA + VBP
(3)pixel_clk = round((HBB+HACT+HFP)*(VBB+VACT+VFP)*FR/1000) KHZ
(4)phy_data_rate = round((HBB+HACT+HFP)*(VBB+VACT+VFP)*FR*output_format/lane个数/1000000) Mbps
output_format是输出数据字节数,例:RBG24即为24

根据以上提供的这些参数就可以完成MIPI DSI的时序初始化。比如我随便找一个LCD的数据手册就会看到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.1 以像素为单位的水平显示时序参数

在LCD屏厂手册里一般都会提供以下三个参数,分别是:

  • hfront-porch:(HFP)
  • hback-porch:(HBP)
  • hsync-len:(HSA)
hback-porch = <160>;
hfront-porch = <136>; 
hsync-len = <4>;

相对应的在以像素为单位的水平时序里还有一个水平脉冲的配置选项:hsync-active,官方文档描述是:hsync pulse is active low/high/ignored,也就是说,如果要配置的话要么就是0/1,要么就不配置,默认配置:

hsync-active = <0>;

4.2 以行为单位的垂直显示时序参数

在LCD屏厂手册里一般都会提供以下三个参数,分别是:

  • vfront-porch:(VFP)
  • vback-porch:(VBP)
  • vsync-len:(VSA)
vback-porch = <16>;
vfront-porch = <16>;
vsync-len = <2>;

相对应的在以行为单位的垂直显示时序里还有一个水平脉冲的配置选项:vsync-active,官方文档描述是:vsync pulse is active low/high/ignored,也就是说,如果要配置的话要么就是0/1,要么就不配置,默认配置:

vsync-active = <0>;

4.3 数据使能 & 像素时钟脉冲参数

(1) de-active:data-enable pulse is active low/high/ignored

de-active = <0>;

(2) pixelclk-active:数据采样的方式

配置为1:上升沿驱动像素数据/下降沿采样数据
配置为0:下降沿驱动像素数据/上升沿采样数据

pixelclk-active = <0>;
  1. 像素时钟的配置

一般像素时钟有一个计算公式,如下:

(h+hbp+hfp+hsa)*(v+vbp+vfp+vsa)*60

也就是说把厂家手册提供给我们的时序参数往这个公式里面套,最终就可以算出我们的像素时钟是多少了。

  1. panel-init-sequence

这部分一般指的是厂家给我们提供的屏幕的初始化代码,官方文档的介绍是这样的:

A byte stream formed by simple multiple dcs packets.
byte 0: dcs data type
byte 1: wait number of specified ms after dcs command transmitted
byte 2: packet payload length
byte 3 and beyond: number byte of payload

荣品的设备树这部分配置如下:

panel-init-sequence = [
   05 78 01 11
   05 78 01 29
  ];

深入探究

1、DSI驱动设备树DCS序列配置MIPI LCD初始化代码

在之前的内容中,我们看到荣品的屏设备树中有这么一段代码,但是里面的数据是什么含义?

panel-init-sequence = [
   05 78 01 11
   05 78 01 29
  ];

这里详细记录了如何在设备树中适配MIPI-DSI LCD初始化代码的详细过程。Linux提供了配置初始化代码的接口,相应的设备树也就支持了,这部分在内核的文档里有写:

kernel/Documentation/devicetree/bindings/display/panel/simple-panel.txt

这个文档里简单描述了一下:

- panel-init-sequence: //初始化序列
- panel-exit-sequence: //退出序列
 A byte stream formed by simple multiple dcs packets. //由简单的多个dcs数据包形成的字节流
  byte 0: dcs data type //第0个字节:dcs数据类型
  byte 1: wait number of specified ms after dcs command transmitted //第1个字节:发送dcs命令后等待指定的毫秒数
  byte 2: packet payload length //第2个字节:数据包有效载荷长度
  byte 3 and beyond: number byte of payload //第3个字节及以后:有效载荷的字节数

一般情况下LCD屏会有初始化和反初始化的过程,但是在实际应用中,一般还很少会用到反初始化,所以LCD面板厂家一般都是只提供初始化代码,在MIPI DSI驱动中,我们需要将这些厂家提供的初始化代码转换为相应的DCS序列,关于初始化序列和退出序列的描述,由于我用的平台是瑞芯微,瑞芯微提供的技术文档也有相应的描述:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

具体参数配置方法,查看原厂瑞芯微给的文档的案例描述:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关于 DCS 类型是怎么来理解的,瑞芯微文档中也可以看到对它的描述:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

理解: 如果只有一个数据,对应的命令类型是0x05;如果有两个数据,对应的命令类型是0x15;如果多于两个数据,对应的命令类型是0x39

2、具体的配置方法(举例)

最近由于需要调试公鸡派MIPI接口的LCD显示屏,然而我已经很久没调过驱动了;厂家给了我下面这一段初始化代码,我一看一脸懵逼,厂商的初始化代码如下:

SET_GENERIC(0x02);
W_D(0x80);W_D(0xAB);
SET_GENERIC(0x02);
W_D(0x81);W_D(0x4B);
SET_GENERIC(0x02);
W_D(0x82);W_D(0x84);
SET_GENERIC(0x02);
W_D(0x83);W_D(0x88);
SET_GENERIC(0x02);
W_D(0x84);W_D(0xA8);
SET_GENERIC(0x02);
W_D(0x85);W_D(0xE3);
SET_GENERIC(0x02);
W_D(0x86);W_D(0xB8);
SET_GENERIC(0x02);
W_D(0x87);W_D(0x5A);
SET_GENERIC(0x02);
W_D(0xB1);W_D(0x38);
SET_GENERIC(0x01);
W_D(0x11);
delay_ms(120);
SET_GENERIC(0x01);
W_D(0x29);

那么这个初始化代码是什么含义呢?厂家一般不会告诉我,也不会给我提供寄存器手册,因为那是他们的知识产权,所以我也没必要知道他们到底设置了什么东西,我只需要知道它们就是协助我点屏的重要步骤之一就可以了。

我们就简单的认为这个初始化代码包含三类指令,分别是:

  • SET_GENERIC
  • W_D
  • delay_ms

不同厂家提供的初始化代码是不同的,但格式基本上都是大同小异,有的初始化代码很少,也有的超级长,比如荣品的设备树里就有一个更长的,如下所示,这个是已经将初始化代码转换为DCS格式的了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可见有些LCD面板厂家提供的初始化代码也是很多的, 所以搞这个真的还是要有点耐心的,否则很容易出错,一旦出错,可能屏幕都点不亮。 以上只是举一个简单的例子,我们需要将上面厂家给我的初始化命令转化成对应的DCS格式,然后添加到设备树的初始化序列里,这样驱动在加载的时候才能够被正确识别到。

首先感谢CSDN网友提供以下思路:

https://blog.csdn.net/sunqinglin4826/article/details/104848529
https://blog.csdn.net/weixin_42399752/article/details/101108550
https://blog.csdn.net/dearsq/article/details/52354593

既然要将初始化代码转换成DCS格式,那么就衍生出下面的步骤:

  • 数个数SET_GENERIC为开始,下一个SET_GENERIC(不包含这次的SET_GENERICDelay)为结束作为一次数据发送,数一数一共有几个数据。

  • 看延时 看看厂家提供的初始化代码里面有没有延时。

确定了以上步骤以后,我们就需要将初始化代码改写成下面的格式:

命令类型+延时数量+数据长度+数据

2.1、普通序列

SET_GENERIC(0x02);
W_D(0x80);W_D(0xAB);

如上,有三个数据,所以命令类型为39,所以第一个序列要这么写:

以下每一个字节一一进行对应:
命令类型 延时数量 数据长度 数据1 数据2 数据3
  39   00   03   02   80  AB

2.2、带延时的序列

SET_GENERIC(0x01);
W_D(0x11);
delay_ms(120);

如上,有两个数据,1个延时,所以命令类型为15,所以带延时的序列要这么写:

以下每一个字节一一进行对应:
命令类型 延时数量(转16进制)  数据长度  数据1  数据2
 15      78        02   01   11

2.3、将厂家给的序列转换为DCS格式序列

以此类推,从厂家给我们的初始化代码转换为序列就是:

39 00 03 02 80 AB
39 00 03 02 81 4B
39 00 03 02 82 84
39 00 03 02 83 88
39 00 03 02 84 A8
39 00 03 02 85 E3
39 00 03 02 86 B8
39 00 03 02 87 5A
39 00 03 02 B1 38
15 78 02 01 11
15 00 02 01 29

所以在设备树里的初始化序列就应该这么写,把上面转换的结果复制到下面来:

panel-init-sequence = [
  39 00 03 02 80 AB
  39 00 03 02 81 4B
  39 00 03 02 82 84
  39 00 03 02 83 88
  39 00 03 02 84 A8
  39 00 03 02 85 E3
  39 00 03 02 86 B8
  39 00 03 02 87 5A
  39 00 03 02 B1 38
  15 78 02 01 11
  15 00 02 01 29
];

所以我们就不难理解以上荣品的DTS里初始化序列的含义:

panel-init-sequence = [
   05 78 01 11
   05 78 01 29
  ];

第一行:

  • 05表示DCS命令类型,表示只有一个数据。
  • 78表示延时时间为(0x78)=> 120ms
  • 01表示指令的数据长度只有一个字节
  • 11表示的就是数据

同理,第二行也是一样的理解,到这里我们就彻底的掌握了设备树关于初始化序列的配置方法了,如果想详细了解驱动代码里是怎么实现的,那么也可以去追一追代码,我觉得这种实现模式太优秀了,不得不说Linux内核实现的DSI驱动设计思想真的很棒!

4、DSI驱动调试LCD时序参数配置

要点亮MIPI DSI接口的LCD,我们还有一个非常重要的配置,那就是屏幕的时序,时序就是点屏的基础,大部分LCD提供的数据手册都大同小异;

1、LCD屏幕显示原理

与纯 RGB 显示屏同理, MIPI DSI 显示参考下图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.1、垂直方向

直接干Datasheet,关于垂直方向,我们只需要关心以下几个参数就可以了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

垂直方向:

  • tvd :垂直方向的分辨率
  • tv :整个垂直方向的周期
  • tvpw :vysnc 脉冲宽度
  • tvb :上边黑框 ===> vbp ===> Vertical Back porch ===> 垂直后肩
  • tvfp :下边黑框 ===> vfp ===> Vertical Front porch ===> 垂直前肩
1.2、水平方向

直接干Datasheet,关于水平方向,我们只需要关心以下几个参数就可以了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

水平方向:

  • thd :水平方向的分辨率
  • th : 整个水平方向的周期
  • thpw :hsync 脉冲宽度
  • thb :左边黑框 ===> hbp ===> Horizontal Back porch ===> 水平后肩
  • thfp :右边黑框 ===> hfp ===> Horizontal Front porch ===> 水平前肩

2、MIPI DSI设备树时序配置

接下来我们照着以上的几个参数,结合数据手册里提供的典型参数往设备树里的时序列表里填,最终时序部分如下:

display-timings {
  native-mode = <&timing0>;
 
  timing0: timing0 {
    clock-frequency = <51200000>; //DCLK
    hactive = <1024>;             //hactive
    vactive = <600>;              //vactive
    hfront-porch = <160>;         //hfp
    hsync-len = <70>;             //hsa
    hback-porch = <160>;          //hbp
    vfront-porch = <12>;          //vfp
    vsync-len = <10>;             //vsa
    vback-porch = <23>;           //vbp
    hsync-active = <0>;           //hync 极性控制 置 1 反转极性
    vsync-active = <0>;           //vsync 极性控制 置 1 反转极性
    de-active = <0>;              //DEN 极性控制
    pixelclk-active = <0>;        //dclk 极性控制
  };
};

其中clock-frequencyDCLK频率,查看以下规格书:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可知,DCLK频率为51.2Mhz,所以这个参数就是51200000

其中clock-frequency的计算公式是这样的:

clock-frequency = (h_active + hfp + hbp + h_sync) * (v_active + vfp + vbp + v_sync) * fps

根据以上公式我们还可以计算出fps

fps = 51200000 / (1024+160+160+70) * (600+23+12+10) = 51200000 / 912030 = 56Hz

这里的56Hz也就是屏幕的刷新率(fps)

时序搞定了,那离点屏就差10%了

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

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

相关文章

Tech Talk:智能电视eMMC存储的五问五答

智能电视作为搭载操作系统的综合影音载体&#xff0c;以稳步扩大的市场规模走入越来越多的家庭&#xff0c;成为人们生活娱乐的重要组成部分。存储部件是智能电视不可或缺的组成部分&#xff0c;用于保存操作系统、应用程序、多媒体文件和用户数据等信息。智能电视使用eMMC作为…

前端FCP指标优化

优化前 第三方依赖按需引入之后&#xff0c;打包的总体积减小到初始值的55%&#xff0c;但是依然存在很大的js文件&#xff0c;需要继续优化 chunk-vendors.js进行分包之后 截图 compression-webpack-plugin压缩之后 截图

【MySQL备份】Percona XtraBackup总结篇

目录 1.前言 2.问题总结 2.1.为什么在恢复备份前需要准备备份 2.1.1. 保证数据一致性 2.1.2. 完成崩溃恢复过程 2.1.3. 解决非锁定备份的特殊需求 2.1.4. 支持增量和差异备份 2.1.5. 优化恢复性能 2.2.Percona XtraBackup的工作原理 3.注意事项 1.前言 在历经了详尽…

大语言模型系列-Transformer(二)

Transformer 模型的入门可以从以下几个方面开始&#xff1a; 1. 理解基本概念 序列到序列&#xff08;Sequence-to-Sequence&#xff09;任务&#xff1a;Transformer 模型主要用于这类任务&#xff0c;如机器翻译、文本摘要等。注意力机制&#xff08;Attention Mechanism&a…

使用dot来画流程图

Dot是一种图形描述语言&#xff0c;属于Graphviz软件的一部分。Graphviz是一个用于可视化图形&#xff08;图表、网络图等&#xff09;的开源工具集。使用Dot语言&#xff0c;你可以创建并描述节点和边&#xff0c;从而生成图形。以下是如何使用Dot语言画图的基本步骤&#xff…

Elasticsearch实战教程: 如何在海量级数据中进行快速搜索

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 Elasticsearch&#xff08;简称ES&#xff09;是一个基于Apache Lucene™的开源搜索引擎&#xff0c;无论在开源还是专有领…

matlab仿真 通信信号和系统分析(下)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第三章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; 一、离散傅里叶变换 clear all n0:30;%信号的时间范围 xsin(0.2*n).*exp(-0.1*n); k0:30;%频率范围 N31; Wnkexp(-j*2*pi/N).…

firewalld(6)自定义services、ipset

简介 在前面的文章中我们已经介绍了zone、rich rule 、--direct等功能和基本配置。在前面文章中&#xff0c;我们提到过firewalld内置了很多服务&#xff0c;可以通过firewall-cmd --get-services来查看服务&#xff0c;也可以通过配置文件查看这些服务/var/lib/firewalld/ser…

短视频电商源码的优势及软件架构解析

短视频电商源码是目前电商行业中非常火热的一个新兴领域&#xff0c;它通过短视频内容和电商商品的结合&#xff0c;为用户提供了一种新的购物体验。下面将介绍短视频电商源码的优势以及软件架构。 首先&#xff0c;短视频电商源码具有以下几个优势&#xff1a; 1、创新的购物体…

WGAN(Wassertein GAN)

WGAN E x ∼ P g [ log ⁡ ( 1 − D ( x ) ) ] E x ∼ P g [ − log ⁡ D ( x ) ] \begin{aligned} & \mathbb{E}_{x \sim P_g}[\log (1-D(x))] \\ & \mathbb{E}_{x \sim P_g}[-\log D(x)] \end{aligned} ​Ex∼Pg​​[log(1−D(x))]Ex∼Pg​​[−logD(x)]​ 原始 GAN …

项目范围管理(信息系统项目管理师)

收集需求的输出是需求文件、需求跟踪矩阵定义范围是制定项目和产品详细描述的过程。本过程的主要作用是描述产品、服务或成果的边界和验收标准。本过程需要在整个项目期间多次反复开展项目范围说明书&#xff1a;是对项目范围、主要可交付成果、假设条件和制约因素的描述。明确…

思维导图插件--jsMind的使用

vue引入jsmind&#xff08;右键菜单&#xff09;_jsmind.menu.js-CSDN博客 第一版 vue-JsMind思维导图实现&#xff08;包含鼠标右键自定义菜单&#xff09;_jsmind 右键菜单-CSDN博客 // 新增节点addNode() {console.log(this.get_selected_nodeid());this.get_selected_…

Jenkins 创建流水线任务

Jenkins是一个流行的持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;工具。 Jenkins 创建任务 选择“流水线”类型&#xff0c;该类型的优点是定制化程度非常高 &#xff08;可选&#xff09;添加“参数化构建” 配置仓库选项(ssh连接、分支)和凭据…

Element-UI - el-table中自定义图片悬浮弹框 - 位置优化

该篇为前一篇“Element-UI - 解决el-table中图片悬浮被遮挡问题”的优化升级部分&#xff0c;解决当图片位于页面底部时&#xff0c;显示不全问题优化。 Vue.directive钩子函数已在上一篇中详细介绍&#xff0c;不清楚的朋友可以翻看上一篇&#xff0c; “Element-UI - 解决el-…

【Python】字典练习

python期考练习 目录 1. 首都名​编辑 2. 摩斯电码 3. 登录 4. 学生的姓名和年龄​编辑 5. 电商 6. 学生基本信息 7. 字母数 1. 首都名 初始字典 (可复制) : d{"China":"Beijing","America":"Washington","Norway":…

企业如何管理安全生产工作?(附模板)

总结一下在企业内管理安全中遇到的一些问题&#xff1a; 1、 管理方式落后&#xff0c;还在使用纸质记录 2、 人员信息杂乱无章&#xff0c;无人整理 3、出现问题找不到源头和负责人 我做系统管理已经7年了&#xff0c;题主说的这些问题我之前也遇到过&#xff0c;相信也有…

Java学习高级一

修饰符 static 类变量的应用场景 成员方法的分类 成员变量的执行原理 成员方法的执行原理 Java之 main 方法 类方法的常见应用场景 代码块 设计模式 单例设计模式 饿汉式单例设计模式 懒汉式单例设计模式 继承 权限修饰符

【MindSpore学习打卡】应用实践-计算机视觉-FCN图像语义分割-基于MindSpore实现FCN-8s进行图像语义分割的教程

图像语义分割是计算机视觉领域中的一个重要任务&#xff0c;它旨在对图像中的每个像素进行分类&#xff0c;从而实现对图像内容的详细理解。在众多图像语义分割算法中&#xff0c;全卷积网络&#xff08;Fully Convolutional Networks, FCN&#xff09;因其端到端的训练方式和高…

Git使用中遇到的问题(随时更新)

问题1.先创建本地库&#xff0c;后拉取远程仓库时上传失败的问题怎么解决&#xff1f; 操作主要步骤&#xff1a; step1 设置远程仓库地址: $ git remote add origin gitgitee.com:yourAccount/reponamexxx.git step2 推送到远程仓库: $ git push -u origin "master&qu…

API接口测试/Swgger-ui未授权访问

目录 API接口 接口文档 接口测试的方法 单流程 多流程 Swgger-ui未授权访问 在之间的一次面试中面试官问到了API接口测试&#xff0c;我回答的不好&#xff0c;因为自己确实不太会&#xff0c;后面才下去学习了&#xff0c;这里复习和练习一下 API接口 API&#xff08;…