当前位置: 首页 > news >正文

Linux屏幕驱动开发调试笔记

引言

首先了解下什么是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 1105 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 1105 78 01 29];

深入探究

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

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

panel-init-sequence = [05 78 01 1105 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 数据339   00   03   02   80  AB

2.2、带延时的序列

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

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

以下每一个字节一一进行对应:
命令类型 延时数量(转16进制)  数据长度  数据1  数据215      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 AB39 00 03 02 81 4B39 00 03 02 82 8439 00 03 02 83 8839 00 03 02 84 A839 00 03 02 85 E339 00 03 02 86 B839 00 03 02 87 5A39 00 03 02 B1 3815 78 02 01 1115 00 02 01 29
];

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

panel-init-sequence = [05 78 01 1105 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>; //DCLKhactive = <1024>;             //hactivevactive = <600>;              //vactivehfront-porch = <160>;         //hfphsync-len = <70>;             //hsahback-porch = <160>;          //hbpvfront-porch = <12>;          //vfpvsync-len = <10>;             //vsavback-porch = <23>;           //vbphsync-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%了

相关文章:

Linux屏幕驱动开发调试笔记

引言 首先了解下什么是MIPI-DSI&#xff1a; MIPI-DSI是一种应用于显示技术的串行接口&#xff0c;兼容DPI(显示像素接口&#xff0c;Display Pixel Interface)、DBI(显示总线接口&#xff0c;Display Bus Interface)和DCS(显示命令集&#xff0c;Display Command Set)&#…...

Nginx Http缓存的必要性!启发式缓存有什么弊端?

&#x1f440; Nginx Http缓存的必要性&#xff01;启发式缓存有什么弊端&#xff1f; 简介启发式缓存引发的问题nginx缓存配置 简介 我们在使用React或者Vue开发项目中会使用hash、chunkhash、contenthash来给静态资源文件进行命名。这带来的好处便是当我们部署完项目后&…...

【RT摩拳擦掌】RT云端测试之百度天工物接入构建(设备型)

【RT摩拳擦掌】RT云端测试之百度天工物接入构建&#xff08;设备型&#xff09; 一&#xff0c; 文档介绍二&#xff0c; 物接入IOT Hub物影子构建2.1 创建设备型项目2.2 创建物模型2.3 创建物影子 三&#xff0c; MQTT fx客户端连接云端3.1 MQTT fx配置3.2 MQTT fx订阅3.3 MQT…...

Mysql和ES使用汇总

一、mysql和ES在业务上的配合使用 一般使用时使用ES 中存储全文检索的关键字与获取的商品详情的id&#xff0c;通过ES查询获取查询商品的列表中展示的数据&#xff0c;通过展示id 操作去获取展示商品的所有信息。mysql根据id去查询数据库数据是很快的&#xff1b; 为什么ES一般…...

Android中使用performClick触发点击事件

Android中使用performClick触发点击事件 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨在Android开发中如何使用 performClick() 方法来触发点击…...

重生之我要学后端01--后端语言选择和对应框架选择

编程语言 后端开发通常需要掌握至少一种编程语言。以下几种语言在后端开发中非常流行&#xff1a; Java&#xff1a;广泛用于企业级应用程序。Python&#xff1a;因其易学性和强大的库支持&#xff08;如Django和Flask&#xff09;而受欢迎。Node.js&#xff08;JavaScript&a…...

C语言 | Leetcode C语言题解之第206题反转链表

题目&#xff1a; 题解&#xff1a; struct ListNode* reverseList(struct ListNode* head) {if (head NULL || head->next NULL) {return head;}struct ListNode* newHead reverseList(head->next);head->next->next head;head->next NULL;return newHea…...

Flink Window DEMO 学习

该文档演示了fink windows的操作DEMO 环境准备&#xff1a; kafka本地运行&#xff1a;kafka部署自动生成名字代码&#xff1a;随机名自动生成随机IP代码&#xff1a;随机IPFlink 1.18 测试数据 自动向kafka推送数据 import cn.hutool.core.date.DateUtil; import com.alibab…...

library source does not match the bytecode for class SpringApplication

library source does not match the bytecode for class SpringApplication 问题描述&#xff1a;springboot源码点进去然后download source后提示标题内容。spring版本5.2.8.RELEASE&#xff0c;springboot版本2.7.18 解决方法&#xff1a;把spring版本改为与boot版本对应的6.…...

Linux基础指令介绍与详解——原理学习

前言&#xff1a;本节内容标题虽然为指令&#xff0c;但是并不只是讲指令&#xff0c; 更多的是和指令相关的一些原理性的东西。 如果友友只想要查一查某个指令的用法&#xff0c; 很抱歉&#xff0c; 本节不是那种带有字典性质的文章。但是如果友友是想要来学习的&#xff0c;…...

【代码随想录算法训练Day52】LeetCode 647. 回文子串、LeetCode 516.最长回文子串

Day51 动态规划第十三天 LeetCode 647. 回文子串 dp数组的含义&#xff1a;i到j的子串是否是回文的&#xff0c;是的话dp[i][j]1 递推公式&#xff1a;if(s[i]s[j]) i j 一个元素 是回文的 |i-j|1 两个元素 是回文的 j-i>1 判断dp[i1][j-1] 初始化&#xff1a;全部初始化成…...

VUE项目安全漏洞扫描和修复

npm audit 1、npm audit是npm 6 新增的一个命令,可以允许开发人员分析复杂的代码并查明特定的漏洞。 2、npm audit名称执行&#xff0c;需要包package.json和package-lock.json文件。它是通过分析 package-lock.json 文件&#xff0c;继而扫描我们的包分析是否包含漏洞的。 …...

Nginx主配置文件---Nginx.conf

nginx主配置文件的模块介绍 全局块&#xff1a; 全局块是配置文件从开始到 events 块之间的部分&#xff0c;其中指令的作用域是 Nginx 服务器全局。主要指令包括&#xff1a; user&#xff1a;指定可以运行 Nginx 服务的用户和用户组&#xff0c;只能在全局块配置。例如&…...

IOS Swift 从入门到精通:写入 Firestore数据库

文章目录 FirestoreManager 类创建文档更新文档更新 Firestore 权限规则现在,我们想要在 Firestore 中添加或更新文档。如果您还没有,我建议您阅读有关设置 Firebase Auth 和从 Firestore 读取的部分。您必须在应用程序中启用 Firebase,并在项目中启用 Firestore 数据库,才…...

维克日记 v0.4.2:开发者友好的数字化笔记工具

维克日记&#xff0c;专为技术开发者和笔记爱好者设计的数字化笔记工具&#xff0c;以其强大的功能和灵活的配置赢得了用户的好评。软件采用Markdown语法&#xff0c;提供实时预览功能&#xff0c;让您的笔记编辑更加高效和直观。维克日记的用户界面简洁而功能齐全&#xff0c;…...

语音房平台交友,语聊APP系统开发线上语音交友平台成熟案例源码出售

随着移动互联网的快速发展&#xff0c;人们对于社交方式的需求也在不断变化&#xff0c;语音房平台交友语助APP作为一种新兴的社交方式&#xff0c;以其独特的语音交流模式和实时互动的特点&#xff0c;受到了越来越多用户的喜爱本文将详细介绍语音房平台交友语聊APP系统的开发…...

VMamba: Visual State Space Model论文笔记

文章目录 VMamba: Visual State Space Model摘要引言相关工作Preliminaries方法网络结构2D-Selective-Scan for Vision Data(SS2D) VMamba: Visual State Space Model 论文地址: https://arxiv.org/abs/2401.10166 代码地址: https://github.com/MzeroMiko/VMamba 摘要 卷积神…...

探索哈希函数:数据完整性的守护者

引言 银行在处理数以百万计的交易时&#xff0c;如何确保每一笔交易都没有出错&#xff1f;快递公司如何跟踪成千上万的包裹&#xff0c;确保每个包裹在运输过程中没有丢失或被替换&#xff1f;医院和诊所为庞大的患者提供有效的医疗保健服务&#xff0c;如何确保每个患者的医疗…...

解析Kotlin中的Unit【笔记摘要】

1. Kotlin的Unit 和 Java的void 的区别 // Java public void sayHello() {System.out.println("Hello!") }// Kotlin fun sayHello(): Unit {println("Hello!") }Unit 和 Java 的 void 真正的区别在于&#xff0c;void 是真的表示什么都不返回&#xff0c…...

仿论坛项目--初识Spring Boot

1. 技术准备 技术架构 • Spring Boot • Spring、Spring MVC、MyBatis • Redis、Kafka、Elasticsearch • Spring Security、Spring Actuator 开发环境 • 构建工具&#xff1a;Apache Maven • 集成开发工具&#xff1a;IntelliJ IDEA • 数据库&#xff1a;MySQL、Redi…...

Spring boot 更改启动LOGO

在resources目录下创建banner.txt文件&#xff0c;然后编辑对应的图案即可 注释工具 Spring Boot Version: ${spring-boot.version},-.___,---.__ /|\ __,---,___,- \ -.____,- | -.____,- // -., | ~\ /~ | …...

python变成几个小程序

专家系统 需要建立‘capital_data.txt’ 空文件 from tkinter import Tk, simpledialog, messageboxdef read_from_file():with open(capital_data.txt) as file:for line in file:line line.rstrip(\n)country, city line.split(/)the_world[country] citydef write_to_fi…...

nginx配置stream代理

项目中遇到某些服务在内网&#xff0c;需要外网访问的情况&#xff0c;需要配置代理访问。可用nginx搭建代理服务。 TCP代理 通过nginx的stream模块可以直接代理TCP服务&#xff0c;步骤如下&#xff1a; 在/etc/nginx/下新建proxy文件夹&#xff0c;用于存放代理配置。此处…...

【瑞吉外卖 | day01】项目介绍+后台登录退出功能

文章目录 瑞吉外卖 — day011. 所需知识2. 软件开发整体介绍2.1 软件开发流程2.2 角色分工2.3 软件环境 3. 瑞吉外卖项目介绍3.1 项目介绍3.2 产品原型展示3.3 技术选型3.4 功能架构3.5 角色 4. 开发环境搭建4.1 数据库环境搭建4.2 Maven项目构建 5. 后台系统登录功能5.1 创建需…...

关于批量采集1688商品主图及链接的方式:软件采集/1688官方API接口数据采集

关于批量采集&#xff0c;我们通常用到的是软件 采集&#xff0c;或者通过1688官方API数据采集的形式&#xff1a;用户输入一组1688商品ID&#xff0c;一行一个&#xff0c;流程会自动逐个打开对应的1688商品详情页&#xff0c;采集主图的所有链接。 结果保存为表格的一行&…...

Shell 获取Hive表的location 信息

用shell 获取建表语句&#xff1a; hive -e "show create table ods_job.ods_job_tb"得到结果&#xff1a; CREATE TABLE ods_job.ods_job_tb(id bigint COMMENT id, auto int COMMENT job开启/关闭&#xff1a;0-关闭&#xff1b;1-开启, ....timeout_kill string…...

从零搭建教育管理系统:Java + Vue.js 教学-02

第三步:创建实体类和 Mapper 接口 现在我们已经设计好了数据库表,接下来使用 MyBatis-Plus 将这些表映射到 Java 对象,以便在代码中轻松地进行操作。 1. 创建实体类 在 src/main/java/<your_package>/entity 目录下 (如果没有该目录,请手动创建),创建与数据库表对应…...

VSCode + GDB + J-Link 单片机程序调试实践

VSCode GDB J-Link 单片机程序调试实践 本文介绍如何创建VSCode的调试配置&#xff0c;如何控制调试过程&#xff0c;如何查看修改各种变量。 安装调试插件 在 VSCode 扩展窗口搜索安装 Cortex-Debug插件 创建调试配置 在 Run and Debug 窗口点击 create a launch.json …...

grpc学习golang版( 五、多proto文件示例 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件2.1 公共proto文件2.2 语音唤醒proto文…...

LeetCode 106 从中序与后序遍历序列构造二叉树

根据中序遍历和后序遍历的性质&#xff0c;还原二叉树&#xff0c;详细见注释 TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {//空&#xff0c;直接返回nullif(inorder.size() 0) return nullptr;//一个&#xff0c;返回一个nod…...

Vue Router的深度解析

引言 在现代Web应用开发中&#xff0c;客户端路由已成为实现流畅用户体验的关键技术。与传统的服务器端路由不同&#xff0c;客户端路由通过JavaScript在浏览器中控制页面内容的更新&#xff0c;避免了页面的全量刷新。Vue Router作为Vue.js官方的路由解决方案&#xff0c;以其…...

YOLO-V2

一、V2版本细节升级 1、YOLO-V2&#xff1a; 更快&#xff01;更强 1.1 做的改进内容 1. YOLO-V2-Batch Normalization V2版本舍弃Dropout&#xff0c;卷积后每一层全部加入Batch Normalization网络的每一层的输入都做了归一化&#xff0c;收敛相对更容易经过Batch Norma…...

pmp考试的通过标准是什么?

PMP考试的是否通过并不是依据类似其他考试的数值成绩&#xff0c;是通过考生收到邮件通知后去主动查询具体的页面得知的。查询页除了电子证书的下载方式&#xff0c;还有成绩报告单的选项以及成绩饼状图&#xff0c;具体如下&#xff1a; 页面中显示“PASS”表示考试通过。 显…...

不懂PyQt5垂直布局?只需3分钟即可学会

PyQt5中实现垂直布局&#xff0c;主要使用QVBoxLayout类。该布局管理器将子控件垂直排列&#xff0c;并可以根据需要自动调整大小。使用QVBoxLayout可以方便地构建从上到下排列的界面元素。 import sys from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QPus…...

从零开始实现大语言模型(二):文本数据处理

1. 前言 神经网络不能直接处理自然语言文本&#xff0c;文本数据处理的核心是做tokenization&#xff0c;将自然语言文本分割成一系列tokens。 本文介绍tokenization的基本原理&#xff0c;OpenAI的GPT系列大语言模型使用的tokenization方法——字节对编码(BPE, byte pair en…...

生物分子生物学实验过程的自动化与智能监控系统设计

开题报告&#xff1a;生物分子生物学实验过程的自动化与智能监控系统设计 一、引言 随着生物科学技术的飞速发展&#xff0c;生物分子生物学实验在科研、医疗、农业等领域的应用日益广泛。然而&#xff0c;传统的生物分子生物学实验过程大多依赖于人工操作&#xff0c;存在操…...

linux的shell脚本编程详解

Shell 脚本是一种用于自动化任务的脚本语言&#xff0c;在 Linux 和其他类 Unix 操作系统中非常流行。它通常用于任务自动化、系统管理和批处理。编写 Shell 脚本并使其自动化编译过程&#xff08;例如使用 gcc 编译 C/C 程序&#xff09;是一种常见的任务。 以下是一个详细的…...

Redis 7.x 系列【11】数据类型之位图(Bitmap)

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 基本命令2.1 SETBIT2.2 GETBIT2.3 BITCOUNT2.4 BITPOS2.5 BITFIELD2.6 BITF…...

如何评定旅游卡的品质与服务?

评定旅游卡的品质与服务&#xff0c;可以从以下几个关键方面进行综合考量&#xff1a; 公司实力与资质&#xff1a;选择有实力、资质齐全的公司发行的旅游卡。查看公司背景&#xff0c;确认其是否长期稳定运营&#xff0c;是否具有旅游行业的专业资质&#xff0c;如旅行社许可证…...

适合学生暑假适用的护眼大路灯有哪些?五款好用护眼灯分享!

在护眼领域&#xff0c;护眼大路灯已经成为越来越多人的选择。这种具备实力的工具可以有效地缓解用眼疲劳、改善光线环境&#xff0c;是学生党和办公族的必备神器。然而&#xff0c;市面上的护眼大路灯品牌众多&#xff0c;如何选择一款性价比高、品质优良的产品呢&#xff1f;…...

linux服务器 部署jenkins

在 Linux 服务器上部署 Jenkins 通常包括以下几个步骤&#xff1a; 更新系统软件包&#xff1a; sudo apt update sudo apt upgrade 安装 Java&#xff1a; Jenkins 需要 Java 运行时环境。推荐使用 OpenJDK 11。 sudo apt install openjdk-11-jdk 添加 Jenkins 软件源并导入…...

电商控价:系统监测的必要性与优势

在品牌的发展进程中&#xff0c;会遭遇各种各样的渠道问题&#xff0c;控价乃是其中颇为关键的一环。品牌进行控价的目的无疑是为了妥善治理低价链接&#xff0c;低价链接的发现途径可以是人工&#xff0c;也可以是系统。力维网络在为上百个品牌提供服务的过程中察觉到&#xf…...

港股下半年能恢复上涨趋势吗?

今日港股两大指数涨跌不一&#xff0c;早盘盘初恒指冲高&#xff0c;涨幅一度扩大至1%。截至收盘&#xff0c;香港恒生指数涨0.57%。板块方面&#xff0c;电力、航空、石油、内险股、燃料电池、环保等板块涨幅居前&#xff1b;互动媒体与服务、生物科技、汽车零部件、新经济概念…...

软件测试项目实战:银行贷款业务测试介绍-2

1、利息计算 正常利息贷款本金*借款天数*贷款年利率/360 罚息逾期本金*逾期天数*逾期年利率/360 复利逾期利息*逾期天数*逾期年利率/360 2、贷款五级分类 正常贷款&#xff1a;正常及逾期60天以内 关注贷款&#xff1a;逾期60天及以上&#xff0c;不足90天 次级贷款&#xff1…...

如何将Hive表的分区字段插入PG表对应的时间戳字段?

文章目录 1、背景描述2、场景分析 1、背景描述 数据仓库的建设通常是为业务和决策服务的。在数仓开发的应用层阶段&#xff0c;BI可以直接从主题层/业务层取数&#xff0c;而前端需要根据具体的作图需求通过后端查询数据库 作图的指标需要根据主题层/业务层做查询计算&#xf…...

Spring Boot与MyBatis的集成应用

Spring Boot与MyBatis的集成应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来聊聊Spring Boot与MyBatis的集成应用。MyBatis是一款优秀的持久层框…...

在昇腾服务器上使用llama-factory对baichuan2-13b模型进行lora微调

什么是lora微调 LoRA 提出在预训练模型的参数矩阵上添加低秩分解矩阵来近似每层的参数更新&#xff0c;从而减少适配下游任务所需要训练的参数。 环境准备 这次使用到的微调框架是llama-factory。这个框架集成了对多种模型进行各种训练的代码&#xff0c;少量修改就可使用。 …...

Kafka 管理TCP连接

生产者管理TCP连接 Kafka生产者程序概览 Kafka的Java生产者API主要的对象就是KafkaProducer。通常我们开发一个生产者的步骤有4步&#xff1a; 第1步&#xff1a;构造生产者对象所需的参数对象。 第2步&#xff1a;利用第1步的参数对象&#xff0c;创建KafkaProducer对象实例…...

electron教程(一)创建项目

一、方式① 根据官网描述将electron/electron-quick-start项目克隆下来并启动 electron/electron-quick-start地址&#xff1a; GitHub - electron/electron-quick-start: Clone to try a simple Electron app git clone https://github.com/electron/electron-quick-start…...

如何在Oracle、MySQL、PostgreSQL上终止会话或取消SQL查询

How to Kill session or Cancel SQL query on Oracle , MySQL, PostgreSQL 数据库维护过程中难免会遇到一些不正常的SQL或会话进程正在占用系统大量资源&#xff0c;临时需要终止查询或kill会话&#xff0c;在Oracle, MySQL, Postgresql数据库中不同的操作。 Oracle KILL会话…...

docker -run hello-world超时

主要原因就是尝试拉取库的时候没有从阿里云镜像里拉&#xff0c;所以设置一下就好了 这里使用的是ubuntu系统&#xff08;命令行下逐行敲就行了&#xff09; sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": [&quo…...

【收藏级神丹】Liae384_刘亦菲_直播可用,平衡度最高的原创神丹,独家珍稀资源

Liae384_刘亦菲_DFL神丹&#xff1a;点击下载 此丹较重&#xff0c;小卡可以使用但不能训练&#xff0c;实测复训适合24G卡8G、12G、16G卡下载练好的专丹直接使用即可384的Liae对各类杂论视频兼容比较好&#xff0c;高参也能容忍高分辨率的DST复用方式: 非必要不用删除AB&…...

【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树

目录 1 -> 底层结构 2 -> AVL树 2.1 -> AVL树的概念 2.2 -> AVL树节点的定义 2.3 -> AVL树的插入 2.4 -> AVL树的旋转 2.5 -> AVL树的验证 2.6 -> AVL树的性能 1 -> 底层结构 在上文中对对map/multimap/set/multiset进行了简单的介绍&…...

利用git将Qt代码托管到U盘或者网盘

文章目录 1.前言2.解决方案3.操作步骤3.1.软件安装3.2.在U盘创建裸仓库3.3.创建Qt程序并将代码上传至U盘3.4.版本标记及切换3.4.在别的电脑上clone代码出来 4.其他5.结语 1.前言 我们在开发项目时&#xff0c;随着项目需求的增加以及bug的修复&#xff0c;肯定会涉及到版本管理…...

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第50课-姿式识别控制机器人

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第50课-姿式识别控制机器人 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界…...

python自动化办公之BeautifulSoup爬取并解析html文本

用到的库&#xff1a;BeautifulSoup 实现效果&#xff1a;爬取网站内容&#xff0c;拿到html文本并解析html文本 代码&#xff1a; 先爬取 # 先导入requests包 import requests urlhttps://www.baidu.com responserequests.get(url) # 做1个断言&#xff0c;如果执行成功&a…...

都是合资7座SUV,大众途昂对比丰田汉兰达,谁更适合家用

在当下,可选择的家用SUV也是比较多,就拿合资七座SUV市场来讲,可选择的就有大众途昂和丰田汉兰达,两款车都是合资七座SUV,且价格比较接近,那么这两款车对比之下,谁更适合家用呢?编辑首先从配置上来对比,我们选择了大众途昂2024款出众款380TSI四驱龙祥版和丰田汉兰达202…...

续写广交会篇章骆驼蓄电池国际版向新而行

近日,第135届广交会在广州落下帷幕。开幕以来,这场被誉为中国第一展的盛会成为了全球贸易的焦点,让更多中国造走向世界,写下贸易强国的新篇章。骆驼蓄电池作为中国汽车低压电池行业前列的蓄电池品牌,同样将中国质造的蓄电池产品推向五湖四海。骆驼蓄电池在汽车低压电池制造…...

【Linux 网络编程】网络的基础知识详解!

文章目录 1. 计算机网络背景2. 认识 "协议"3. 协议分层 1. 计算机网络背景 网络互联: 多台计算机连接在一起, 完成数据共享; &#x1f34e;局域网&#xff08;LAN----Local Area Network&#xff09;: 计算机数量更多了, 通过交换机和路由器连接。 &#x1f34e; 广…...

Unix环境高级编程--8-进程控制---8.1-8.2进程标识-8.3fork函数-8.4 vfork函数

1、进程控制几个过程 创建进程--》执行进程---》终止进程 2、进程标识 &#xff08;1&#xff09;专用进程&#xff1a;ID为0的进程是调度进程&#xff0c;常常被称为交换进程&#xff0c;也称为系统进程&#xff1b; ID为1通常是init进程&#xff0c;在自举结束时由内核调用…...

【Go】Swagger v2 转 OpenApi v3 CLI - swag2op

写这个工具的原因&#xff0c;也是受万俊峰老师的启发&#xff0c;他把工作中重复的事情&#xff0c;整合到一个工具&#xff0c;然后开源&#xff0c;这件事很赞。 swag2op 在 【Go】Go Swagger 生成和转 openapi 3.0.3 这篇文档&#xff0c;主要是对 swagger 如何生成&#…...

索引问题引起的执行计划偏移(EBS Cost Management performance issue )

之前遇到的一个EBS性能问题&#xff0c;更新至CSDN Create Accounting - Cost Management_performance issue SYMPTOMS 元旦过后&#xff0c;create accounting cost management执行时间过长&#xff0c;还时常报错&#xff0c;影响正常作业&#xff1b; 1.对比2018/12和20…...