RK3399 Linux-SDK mipi屏幕驱动及调试

2023-10-27

一,流程及通路

    我接触到的三款mipi屏幕,基本的点亮流程都是很一致的,就是背光使能-背光点亮-屏幕使能-reset引脚按指定时序/波形拉高或拉低-初始化序列命令发送。

    3399的linuxSDK中,包含一种类似通用的屏幕驱动。本文档以使用此驱动为前提,不包含原理内容(硬件基础实在太差,原理自己也没有搞很通),只描述如何尽快的完成屏幕配置并最终将屏幕点亮。给自己留一个记录,也希望其中的内容能对刚上手的朋友们有一点帮助。

    流程上分为以下几步:

(1)需要预先向屏幕厂商讨要一些屏幕关键参数及资料。

(2)进行关键引脚对应

(3)进行DTS配置

(4)固件编译,烧写调试

    文档会按顺序说明以上几步的关键位置及步骤。

二,参数及配置

2.1 关键引脚对应

    按上述流程说明,我们需要对应以下几个引脚:

    1.屏幕使能;2.屏幕reset;3.背光使能;4.背光pwm

    需要根据核心板原理图,底板原理图(如果存在转接板还要看转接板部分的原理图),屏幕接线端接线的原理图三个确定内核中引脚的对应。

    按3399来讲,一般是有4个GPIO分组。常见的原理图写法,应该是类似GPIO4_D5这种写法。各个引脚完成对应后记录好名称,需要配置到DTS中,下面文档会提到DTS中引脚的改写方式。

2.2 向屏幕厂商讨要一些屏幕关键参数及资料

    主要包括初始化序列,display off序列,reset波形,timing参数

    其实除去序列外,波形及timing参数都可以通过屏幕的spec或datasheet文件中读取,如需要磨练此部分的个人技能,可以尝试进行自己的对应。不过由于我硬件基础差,文档多数是英文且含有较多专业词汇,时序和参数对应学习成本也比较高,这部分屏幕厂商应该会有的。讨要一下会减少很多的时间花费,也会更准确一点。

2.3 屏幕初始化序列/display off序列及Linux平台改写

    屏幕在点亮后会涉及到初始化序列发送,这部分序列厂家会提供。不过一般由于mipi屏幕常用于安卓平台,有些还直接用单片机驱动,故厂家给出的序列极少会是直接满足要求的,都需要进行一定的改写。

    现举例说明改写方式。一般厂家给出的文档可能是这样的:

    不同厂家提供的文档写法可能有些不同,不过基本还是相通的.

2.3.1 改写方法/公式

    以图中内容来讲,有三种指令:GP_COMMAND_PA,SPI_WriteData,Delay。Delay很好理解,延时嘛,一般输入的参数就是延时数量,延时单位一般是毫秒(ms).另两种其实不用区别,只需要掌握以下方式:

    1.数个数;以GP_COMMAND_PA为开始,下一个GP_COMMAND_PA(不包含这次的GP_COMMAND_PA和Delay)为结束作为一次数据发送,数一共有几个数据。

    2.看延时。看是否存在延时。

    改写格式上是这样的:

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

    命令类型根据上文提到的数个数来确定,只讲三种:一个数据,两个数据,多于两个数据

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

    延时数量就是根据代码中的延时,转换为16进制就好。

    数据长度,就是数个数的结果,不改写前一次数据发送有几个数据,转换为16进制填入此位置。

    数据就是把函数中除延时外的内容按从上到下顺序接在后面就好。注意全部数据为16进制,0x要求省略。

2.3.2 改写举例

    以上图作为依据,分别将三种类型的写法做个举例:

    一、多个数据情况

    上图中红框,按数个数方式可确定有四个数据,需要用39指令。本次发送无延时,故延时数量为0.数据长度为4.数据内容为FF 98 81 00.改写后结果为:

39 00 04 FF 98 81 00

    二、两个数据情况(带延时)

    上图中红框,按数个数方式可确定有两个数据,需要用15指令。本次发送延时为1.数据长度为2.改写后结果为:

15 01 02 3A 77

    三、单个数据情况

    上图中红框,按数个数方式可确定有一个数据,需要用05指令。本次发送延时为200.数据长度为1.改写后结果为:

05 C8 01 11

    全部数据按顺序改写完成后,先保存在一个文件中,后续配置DTS时会使用到。

2.4 DTS配置

    这一部分是重点,全部之前的工作全为此处进行准备。

    首先,进行DTS文件对应。dts文件存于 sdk目录/kernel/arch/arm64/boot/dts/rockchip/ 中。由于瑞芯微平台提供两种编译内核的方式,故请在对应前确认到底使用的是哪一个DTS文件。

    DTS写法这里不赘述(主要我还没有对写法全通),主要描述需要添加的内容和具体放置位置。

    共需要以下几个重点内容:dsi,route_dsi,backlight,vcc_lcd,dsi_in_vopb,dsi_in_vopl,vopb。

    另注意,由于DTS文件设计到层层包含(DTS文件可以包含后缀为.dtsi的文件,作用就像C语言中的.h文件),故建议重要配置及板卡特性配置写到最后一级的DTS文件中,防止由于在较高层级的dtsi配置后手误在后面又进行了配置,导致配置被错误覆盖。

2.4.1 dsi

    dsi部分的内容较多,只说明重点内容:

backlight = <&backlight>;
power-supply = <&vcc_lcd>;
enable-gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>; 
reset-gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>;

    enable-gpios表示屏幕使能引脚,要求拉高,GPIO_ACTIVE_HIGH意为拉高。reset-gpios表示屏幕reset引脚,具体拉高拉低,要根据内核配置和时序要求来进行对应修改。

    说明以下引脚对应,以reset引脚来举例。对应芯片引脚为GPIO4_D5。写法上如上述写法,引脚分组写为&gpio4,对应引脚的GPIO4。D5的数字是这么对应的。一般每个引脚分组再细分为ABCD四组,按顺序对应数字0,1,2,3.D5对应的数字方式,是字母对应数字乘以8再加上字母后数字,D5的话就是3*8+5=29.

reset-delay-ms = <1>;
disable-delay-ms = <10>;
init-delay-ms = <10>;
enable-delay-ms = <20>;	
prepare-delay-ms = <10>;
unprepare-delay-ms = <10>;
dsi,lanes = <4>; 
status = "okay";

    上述配置中有一些延时,我暂时了解到的相对重要的是reset-delay-ms和init-delay-ms。reset-delay-ms是在屏幕初始化过程中,第一次操作reset引脚之前的延时。init-delay-ms,是在屏幕初始化过程中,第一次操作reset引脚之后的延时。如有特殊的reset时序要求,可分别在uboot和kernel中进行修改,具体代码分别为:

uboot:
u-boot\drivers\video\drm\rockchip_panel.c 
修改时序:panel_simple_prepare

kernel:
kernel\drivers\gpu\drm\panel\panel-simple.c
修改时序:panel_simple_prepare

    需注意,reset引脚时序配置,如DTS中route_dsi开启,则无特殊情况开机过程kernel部分的reset引脚控制不调用,kernel部分的reset引脚配置,只在屏幕出现休眠唤醒时使用。

dsi,lanes = <4>;

    dsi,lanes = <4>;是配置当前mipi是几通道的,需根据屏幕实际情况配置。

panel-init-sequence = [];

    panel-init-sequence填写刚刚改写好的初始化序列。

panel-exit-sequence

    panel-exit-sequence填写display off序列,一般为两条,也需要厂家提供。

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

	timing0: timing0 {
		clock-frequency = <59000000>;
		hactive = <720>;
		vactive = <1280>;
		hback-porch = <40>;
		hfront-porch = <60>;
		vback-porch = <32>;
		vfront-porch = <28>;
		hsync-len = <8>;
		vsync-len = <6>;
		hsync-active = <0>;
		vsync-active = <0>;
		de-active = <0>;
		pixelclk-active = <1>;
	};
};

    这一部分也很重要,是屏幕的一些参数。hactive和vactive就是水平数值的像素,也就是屏幕分辨率了。

    hback-porch,hfront-porch,vback-porch,vfront-porch按顺序简写为HBP,HFP,VBP,VFP,这个跟厂家讨要后,根据简写字母对应即 可。

    hsync-len,vsync-len也请与厂家沟通确定

    clock-frequency 像素时钟频率,厂家如不给出,可以通过公式计算出。公式为:

像素时钟频率 = (hactive+hbp+hfp+hsync-len)x (vactive+vbp+vfp+vsync-len)xfps

    然后保留两位有效数字(不要四舍五入),后面数据直接填0即可。

    最后附上整体的dsi配置,供参考。

&dsi {
	status = "okay";
	dsi_panel: panel {
		compatible ="simple-panel-dsi";
		reg = <0>;
		backlight = <&backlight>;
		//power-supply = <&vcc_lcd>;

		enable-gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>; 
		reset-gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>;//此处我自己改了内核驱动代码
                                                   //做了特殊时序
                                                   //不建议参考,通常配置为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>;

		reset-delay-ms = <1>;
		disable-delay-ms = <10>;
		init-delay-ms = <10>;
		enable-delay-ms = <20>;	
		prepare-delay-ms = <10>;
		unprepare-delay-ms = <10>;
		dsi,lanes = <4>; 
		status = "okay";

		panel-init-sequence = [
			39 00 04 FF 98 81 03
			15 00 02 01 00
			15 00 02 02 00
			15 00 02 03 72
			15 00 02 04 00
			15 00 02 05 00
			... ... ... ... //这部分内容太多了,每个屏幕都有不同,全部省略方便查看
			05 C8 01 11
			05 C8 01 29
		];

		panel-exit-sequence = [
			05 14 01 28
			05 78 01 10
		];

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

			timing0: timing0 {
				clock-frequency = <59000000>;
				hactive = <720>;
				vactive = <1280>;
				hback-porch = <40>;
				hfront-porch = <60>;
				vback-porch = <32>;
				vfront-porch = <28>;
				hsync-len = <8>;
				vsync-len = <6>;
				hsync-active = <0>;
				vsync-active = <0>;
				de-active = <0>;
				pixelclk-active = <0>;
			};
		};
	};
};

2.4.2 backlight

    根据翻译,此处为背光配置。

&backlight {
	status = "okay";
	pwms = <&pwm1 0 25000 0>;
 	enable-gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>;
};

    注意,pwms要与芯片引脚对应,确认具体是哪一组;enable-gpios表示使能引脚,使能引脚如硬件级别保证了拉高,就可以不进行配置了。另注意,使能与PWM是两个引脚,使能引脚千万不要配置错误,如错误会导致异常的系统内核循环,无法正常启动系统。

    另,需注意对应的pwm在DTS中是否已启用。

    启用写法如下:

&pwm1 {
	status = "okay";
};

2.4.3 route_dsi

    这个配置,作用是是否经由mipi接口在uboot和kernel阶段显示过度图片(图片可更换)。开启此配置的方式为:

&route_dsi{
	status = "okay";
};

    这个配置的生效,还仰仗uboot阶段使用kernel的dtb。uboot开启使用kernel的dtb功能的配置相对简单,只需在使用的config文件中添加CONFIG_USING_KERNEL_DTB=y即可。(注意此配置有一项项配置依赖,OF_LIVE).

    其实此项配置还与mipi的驱动链路相关。理论上就我现有了解,HOST链接为VOP->MIPI-DSI->Panel,VOP在kernel中分为vopb和vopl,route_dsi这个配置在rk3399.dtsi中配置了一个connect,也就是链接到哪一个vop,之后也会讲到将DSI具体配置到哪个链路中。要求此项配置中connect选择的vop与实际配置的vop要一致,才能打通这个通路。

    如配置为vopb,配置方式为在此配置中添加connect = <&vopb_out_dsi>;

2.4.4 dsi通路

    通路问题在上一节有讲到,假定我们将dsi配置到vopb中,则共需要进行dsi_in_vopl,vopb,dsi_in_vopb这三项的配置。

    首先,vopb要打开:

&vopb {
	status = "okay";
};

    其次,dsi_in_vopl要关闭

&dsi_in_vopl{
	status = "disabled";
};

    最后,dsi_in_vopb要打开

&dsi_in_vopb{
	status = "okay";
};

    以上全部完成修改,通路就已经配置完毕了。剩余其他基本在dts文件中都有默认配置

三、调试

    说明一些调试内容。

    内容上如完成以上配置,屏幕应是成功点亮的。背光不亮,有可能是该组pwm没有使能;如使能无背光,检查以下enable引脚及pwm引脚配置。如以上全都正确,多数是硬件问题了(pwm是独立于屏幕配置之外的,故只要将该组pwm使能,背光上电就会亮,无论是否有uboot部分的配置及启用)。

    之后如屏幕无法点亮,可以跟进内核查看uboot部分及kernel部分打印,查看错误原因。

    建议开启uboot阶段的显示,能屏蔽系统问题直接去定位驱动及配置问题。

    如参数配置后屏幕背光亮但无显示,可能是驱动链路问题,需要进行dsi的链路检查,重点查看route_dsi的初始配置链路,和2.4.4 dsi通路对应内容。

    如链路正确,驱动正确且内核显示已绑定,仍有背光无显示,可以查看一下reset引脚配置是否正确,如正确,抓取以下启动时的波形,看是否reset波形时间上有问题。

    类似花屏等的问题,可以参考相对有经验的大神博客:https://me.csdn.net/Shushan1,个人受益匪浅。

    另调试过程中出现过一种奇怪现象,如启动uboot显示logo,保持系统级别默认屏幕显示方向,屏幕初始化只在uboot阶段进行,内核阶段不进行。如进行默认屏幕显示方向翻转后,内核运行的最后,会重新初始化一遍屏幕(官方请教后好像是一种休眠唤醒)。这种情况下屏幕会短暂的灭-亮,之后显示系统界面。

    奇怪在哪儿呢,奇怪在内核进行屏幕初始化后,屏幕有几率灰屏。现象上灰屏时内核无其他错误打印,但灭-亮的时间会短很多。个人由于不通原理,考虑到有可能是系统界面显示较快与屏幕初始化有冲突,在发送完初始化序列后,内核代码中再添加固定50ms的延时。之后就再没出现过灰屏问题了。

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

RK3399 Linux-SDK mipi屏幕驱动及调试 的相关文章

  • 如何在 Linux 中使用单行命令获取 Java 版本

    我想通过单个命令获取 Linux 中的 Java 版本 我是 awk 的新手 所以我正在尝试类似的事情 java version awk print 3 但这不会返回版本 我将如何获取1 6 0 21从下面的Java版本输出 java ve
  • 编写多个mysql脚本

    是否可以在复合脚本中包含其他 mysql 脚本 理想情况下 我不想为包含的脚本创建存储过程 对于较大的项目 我想分层维护几个较小的脚本 然后根据需要组合它们 但现在 我很乐意学习如何包含其他脚本 source是一个内置命令 您可以在 MyS
  • Xenomai 中的周期性线程实时失败

    我正在创建一个周期性线程 它在模拟输出上输出方波信号 我正在使用 Xenomai API 中的 Posix Skin 和 Analogy 我使用示波器测试了代码的实时性能 并查看了方波信号 频率为 1kHz 的延迟 我应该实现 250us
  • sqlite 插入需要很长时间

    我正在将不到 200 000 行插入到 sqlite 数据库表中 我只是在终端中通过 sqlite3 使用一个非常简单的 sql 文件 我打赌它已经运行了至少 30 分钟 这是正常现象还是我应该关闭该过程并尝试不同的方法 sqlite中的插
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0
  • 使用命令行将 MediaWiki 维基文本格式转换为 HTML

    我倾向于编写大量文档 因此 MediaWiki 格式对我来说很容易理解 而且比编写传统 HTML 节省了我很多时间 然而 我也写了一篇博客 发现一直从键盘切换到鼠标来输入正确的 HTML 标签会增加很多时间 我希望能够使用 Mediawik
  • linux下如何获取昨天和前天?

    我想在变量中获取 sysdate 1 和 sysdate 2 并回显它 我正在使用下面的查询 它将今天的日期作为输出 bin bash tm date Y d m echo tm 如何获取昨天和前天的日期 这是另一种方法 对于昨天来说 da
  • Gradle 1.3:build.gradle 不构建类

    这里有一个新问题 我有一个 build gradle 文件apply plugin java在其中 并与 java 项目 包关联 当我跑步时gradle build从命令行我得到 compileJava UP TO DATE process
  • Bash 脚本 - 迭代 find 的输出

    我有一个 bash 脚本 其中需要迭代 find 命令输出的每一行 但似乎我正在迭代 find 命令中的每个单词 以空格分隔 到目前为止我的脚本看起来像这样 folders find maxdepth 1 type d for i in f
  • 进程名称长度的最大允许限制是多少?

    进程名称允许的最大长度是多少 我正在读取进程名称 proc pid stat文件 我想知道我需要的最大缓冲区 我很确定有一个可配置的限制 但就是找不到它在哪里 根据man 2 prctl http man7 org linux man pa
  • Scrapy FakeUserAgentError:获取浏览器时发生错误

    我使用 Scrapy FakeUserAgent 并在我的 Linux 服务器上不断收到此错误 Traceback most recent call last File usr local lib64 python2 7 site pack
  • numpy 未定义符号:PyFPE_jbuf

    我正在尝试使用一百万首歌曲数据集 为此我必须安装 python 表 numpy cython hdf5 numexpr 等 昨天我设法安装了我需要的所有内容 在使用 hdf5 遇到一些麻烦之后 我下载了预编译的二进制包并将它们保存在我的 b
  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • 在 LINUX 上使用 Python 连接到 OLAP 多维数据集

    我知道如何在 Windows 上使用 Python 连接到 MS OLAP 多维数据集 嗯 至少有一种方法 通常我使用 win32py 包并调用 COM 对象进行连接 import win32com client connection wi
  • 无法执行'x86_64-conda_cos6-linux-gnu-gcc':没有这样的文件或目录(pysam安装)

    我正在尝试安装 pysam 执行后 python path to pysam master setup py build 这个错误的产生是 unable to execute x86 64 conda cos6 linux gnu gcc
  • 如何不断刷新屏幕并实时更新[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在linux上写一个C程序 不断刷新屏幕并实时更新 例如类似于top终端中的命令 谁能指出我正确的方向 为了保持它跨终端类型的可移
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a

随机推荐

  • sqli-labs POST (18-22)

    LESS 18 随手输入username和password 可以从回显中看到 当用户名密码正确时 会有如下回显 错误时只有一个 Your IP ADDRESS is 127 0 0 1 根据提示可知是user agent的http头注入 用
  • C/C++线性表的实现

    新手出路 多多请教 线性表的定义 线性表 linear list 是最基本 最简单 最常用的一种数据结构 线性表中数据元素之间的关系是一对一的关系 即除了第一个和最后一个数据元素之外 其它数据元素都是首尾相接的 但这只适用大部分线性表 而不
  • C#笔记1--如何在登录界面设置主界面的ToolStripMenuItem的enabled属性,实现不同用户进入不同模块

    C 如何在登录界面设置主界面的ToolStripMenuItem的enabled属性 实现不同用户进入不同模块 写winform程序的时候 相信很多人都想在登录的时候根据用户类型使主界面的ToolStripMenuItem选项部分禁止 从而
  • Spring boot源码初识三 自定义starter

    项目结构 1 父级项目 my springboot starter 2 子module my spring boot starter 3 子module my spring boot starter autoconfigure 4 star
  • FAPI专题-6:5G FAPI接口 - 中文规范-2- 主要流程

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 117602098 目录 第1章 概述
  • Linux命令学习 - Locate

    Locate Linux locate命令简介 语法 参数 附加说明 updatedb的配置文件 etc updatedb conf 设置定时updatedb Crontab命令 Linux locate命令简介 locate locate
  • 常见的magent问题系列二--Fatal error: Call to a member function toHtml() on a non-object in ../../Layout.php

    有些模板不兼容 就会出现这种情况 Fatal error Call to a member function toHtml on a non object in home www yourMagento html gamemore app
  • mysql-按照指定字段排序

    select from order ORDER BY FIELD status UNPAID DELIVERED PAID WAIT DELIVER desc asc
  • uart和usart的区别

    uart 通用异步收发传输器 Universal Asynchronous Receiver Transmitter 通常称作UART 是一种异步收发传输器 是电脑硬件的一部分 它将要传输的资料在串行通信与并行通信之间加以转换 作为把并行输
  • 2023苹果CMS v10魔加主题1.1.6破解版 支持苹果CMS全部版本

    2023苹果cms v10魔加主题1 1 6破解版 支持苹果cms全部版本 后台快捷菜单配置添加魔加主题 mojia theme div class layui tab item blockquote class layui elem qu
  • jquery控制a标签点击后禁止再次点击

    function test 防止多次点击提交 if div a hasClass disabled return div a addClass disabled div a layui layer btn0 text 提交中 div a l
  • mysql5.7 主从安装

    1 安装mysql5 7 1 1 下载mysql源安装包 wget http dev mysql com get mysql57 community release el7 8 noarch rpm 1 2 安装mysql源 yum ins
  • 自学C++(四)//三目运算符

    三目运算符 阅读如下代码 if a gt b z a else z b 该代码可以化简为z a gt b a b z a gt b a b 该式是一个具有3个操作对象的条件表达式 其中的 加起来叫三目y运算符 三目运算符的优先级 执行方向是
  • 1.根据VADeaths数据集,分别绘制城镇居民与农村居民死亡情况的饼图,添加标题及图例说明,并分析图表。

    1 根据VADeaths数据集 分别绘制城镇居民与农村居民死亡情况的饼图 添加标题及图例说明 并分析图表 2 将第1题的结果保存为PNG文件格式 并储存到当前工作目录下 png 农村居民死亡情况 png width 1200 height
  • 关于codeblocks出现can't find compiler的解决方法

    关于codeblocks不能找到编译器的问题我来介绍一下解决的方法 1 首先要确定你的codeblocks是自带编译器的版本 你可访问codeblocks的官网 www codeblocks org 来到下载页面 如下图 点击第一个Down
  • 策略模式+Spring——让我们的代码更加高大上一点

    if else if else 代码是实际的项目代码中出现的比例还是蛮高的 特别是针对一些业务需求根据不同类型来进行不同的业务处理 针对这种业务模型 我们来试着使用策略模式结合Spring来优化我们的代码 让代码更加高大上一点 为了更好得结
  • n的阶乘求解方法

    n 的阶乘求解方法有以下三种 第一种通过递归计算 n int input def N a 定义一个函数进行阶乘计算 if a 1 return a else return N a 1 a print N n 第二种方法就是调用math库 通
  • 狂神说Mybatis最全课堂笔记

    Mybatis 自己整理的狂神说Mybatis学习笔记 环境 JDK1 8 Mysql 5 7 maven 3 6 1 IDEA 回顾 JDBC Mysql Java基础 Maven Junit SSM框架 配置文件 最好的方式 看官方文档
  • 小程序,压缩图片

    我们在小程序上 直接上传手机相册及拍照的图片时 因为图片过大 如10m 手机端不像我们再计算机上传输那么快 也没那么稳定 解决办法 在图片上传前压缩图片 压缩图片就是将图片尺寸 图片质量降低 把这两个指数降低到合适的规格 1 首先在 wxm
  • RK3399 Linux-SDK mipi屏幕驱动及调试

    一 流程及通路 我接触到的三款mipi屏幕 基本的点亮流程都是很一致的 就是背光使能 背光点亮 屏幕使能 reset引脚按指定时序 波形拉高或拉低 初始化序列命令发送 3399的linuxSDK中 包含一种类似通用的屏幕驱动 本文档以使用此