17_LinuxLCD驱动

2023-11-05

目录

Framebuffer设备

LCD驱动简析

LCD驱动程序编写

LCD屏幕参数节点信息修改

LCD 屏幕背光节点信息

使能Linux logo显示

设置LCD作为终端控制台


Framebuffer设备

先来回顾一下裸机的时候LCD驱动是怎么编写的,裸机LCD驱动编写流程如下:

1.初始化I.MX6U的eLCDIF控制器,重点是LCD屏幕宽(width)、高(height)、hspw、hbp、hfp、vspw、vbp和vfp 等信息。

2.初始化LCD像素时钟。

3.设置RGBLCD显存。

4.应用程序直接通过操作显存来操作LCD,实现在LCD上显示字符、图片等信息。

在Linux中应用程序最终也是通过操作RGB LCD的显存来实现在LCD上显示字符、图片等信息。在裸机中我们可以随意的分配显存,但是在Linux系统中内存的管理很严格,显存是需要申请的,不是你想用就能用的。而且因为虚拟内存的存在,驱动程序设置的显存和应用程序访问的显存要是同一片物理内存。

为了解决上述问题, Framebuffer诞生了, Framebuffer翻译过来就是帧缓冲,简称fb,因此大家在以后的Linux学习中见到"Framebuffer"或者“fb”的话第一反应应该想到RGBLCD或者显示设备。fb是一种机制,将系统中所有跟显示有关的硬件以及软件集合起来,虚拟出一个 fb 设备,当我们编写好LCD 驱动以后会生成一个名为/dev/fbX(X=0-n)的设备,应用程序通过访问/dev/fbX这个设备就可以访问LCDNXP官方的Linux内核默认已经开启了LCD驱动,因此我们是可以看到/dev/fb0这样一个设备,如图所示:

 图中的/dev/fb0就是LCD对应的设备文件,/dev/fb0是个字符设备,因此肯定有

file-operations操作集,fb的fileoperations操作集定义在drivers/video/fbdev/core/fbmem.c文件中,如下所示:

LCD驱动简析

LCD裸机例程主要分两部分:

1.获取LCD的屏幕参数。

2.根据屏幕参数信息来初始化eLCDIF接口控制器。不同分辨率的LCD屏幕其eLCDIF控制器驱动代码都是一样的,只需要修改好对应的屏幕参数即可。屏幕参数信息属于屏幕设备信息内容,这些肯定是要放到设备树中的,因此本实验的主要工作就是修改设备树,NXP官方的设备树已经添加了LCD设备节点,只是此节点的LCD屏幕信息是针对NXP官方EVK开发板所使用的4.3寸480*272编写的,需要将其改为我们所使用的屏幕参数。简单看一下NXP 官方编写的Linux下的LCD驱动,打开imx6ull.dtsi,然后找到Icdif节点内容,如下所示:

示例代码59.1.2.1中的Iedif节点信息是所有使用I.MX6ULL芯片的板子所共有的,并不是完整的ledif节点信息。像屏幕参数这些需要根据不同的硬件平台去添加,比如向imx6ullalientek-emmc.dts中的lcdif节点添加其他的属性信息。从示例代码可以看出lcdif节点的compatible属性值为"fsl,imx6ul-ledif"和"fsl,imx28-ledif",因此在Linux源码中搜索这两个字符串即可找到I.MX6ULL的LCD驱动文件,这个文件为drivers/video/fbdev/mxsfb.c, mxsfb.c就是 I.MX6ULL的LCD驱动文件,在此文件中找到如下内容:

从示例代码可以看出,这是一个标准的platform驱动,当驱动和设备匹配以后mxsfb_probe 函数就会执行。在看mxsfb_probe函数之前我们先简单了解一下Linux下Framebuffer驱动的编写流程, Linux内核将所有的Framebuffer抽象为一个叫做fb_info的结构体,fb_info结构体包含了Framebuffer设备的完整属性和操作集合,因此每一个Framebuffer设备都必须有一个fb_info。换言之就是, LCD的驱动就是构建fb_info,并且向系统注册fb_info的过程。fb_info 结构体定义在include/linux/fb.h文件里面,内容如下(省略掉条件编译):

 fb_info结构体的成员变量很多,我们重点关注var、fix、fbops、 screen_base、screen_size和pseudo_palette。

mxsfb_probe函数的主要工作内容为:

1.申请fb_info。

2.初始化 fb_info 结构体中的各个成员变量。

3.初始化eLCDIF控制器。

4.使用register_framebuffer函数向Linux内核注册初始化好的fb_info。register_framebuffer函数原型如下:

 fb_info:需要上报的

返回值: 0,成功;负值,失败。

接下来我们简单看一下mxsfb_probe函数,函数内容如下(有缩减):

 第1374行, host结构体指针变量,表示I.MX6ULL的LCD的主控接口, mxsfb_info结构体是NXP定义的针对I.MX系列SOC的Framebuffer设备结构体。也就是前面一直说的设备结构体,此结构体包含了I.MX系列SOC的Framebuffer设备详细信息,比如时钟、eLCDIF控制器寄存器基地址、fb_info等。

第1395行,从设备树中获取eLCDIF接口控制器的寄存器首地址,设备树中Icdif节点已经设置了eLCDIF寄存器首地址为0X021C8000,因此res=0X021C8000。

第1401行,给host申请内存,host为mxsfb_info类型结构体指针。

第1407行,给fb_info申请内存,也就是申请fb_info。

第1413~1414行,设置host的fbinfo成员变量为fb_info,设置fb_info的par成员变量为host。通过这一步就将前面申请的host和fb_info联系在了一起。

第1416行,申请中断,中断服务函数为mxsfb_irq_handler。

第1425行,对从设备树中获取到的寄存器首地址(res)进行内存映射,得到虚拟地址,并保存到 host的base成员变量。因此通过访问host的base成员即可访问I.MX6UULL的整个eLCDIF寄存器。其实在mxsfb.c中已经定义了eLCDIF各个寄存器相比于基地址的偏移值,如下所示:

 继续回到示例代码中的mxsfb_probe函数,第1462行,给fb_info中的pseudo_palette.申请内存。

第1473行,调用mxsfb_init_fbinfo函数初始化fb_info,重点是fb_info的var、fix、 fbops,screen_base和screen_size。其中fbops是Framebuffer设备的操作集, NXP 提供的fbops为mxsfb_ops,内容如下:

 关于mxsfb_ops里面的各个操作函数这里就不去详解的介绍了。mxsfb_init_fbinfo函数通过调用mxsfb_init_fbinfo_dt函数从设备树中获取到LCD的各个参数信息。最后, mxsfb_init_fbinfo函数会调用mxsfb_map_videomem函数申请LCD的帧缓冲内存(也就是显存)。

第1489-1490行,设置eLCDIF控制器的相应寄存器。

第1494 行,最后调用register_framebuffer函数向Linux内核注册fb_info。mxsfb.c文件很大,还有一些其他的重要函数,比如mxsfb_remove、mxsfb_shutdown等,这里就简单的介绍了一下mxsfb_probe 函数,至于其他的函数大家自行查阅。

LCD驱动程序编写

需要做的就是按照所使用的LCD来修改设备树。重点要注意三个地方:

1.LCD 所使用的 IO 配置。

2.LCD屏幕节点修改,修改相应的属性值,换成我们所使用的LCD屏幕参数。

3.LCD 背光节点信息修改,要根据实际所使用的背光IO来修改相应的设备节点信息。接下来依次来看一下上面这两个节点改如何去修改:

LCD屏幕IO配置

首先要检查一下设备树中LCD所使用的IO配置,这个其实NXP都已经给我们写好了,不需要修改,不过还是要看一下。打开imx6ull-alientek-emmc.dts文件,在iomuxc节点中找到如下内容:

 第2-27行,子节点pinctrl_ledif_dat,为RGB LCD的24根数据线配置项。

第30~36行,子节点pinctrl_ledif_ctrl,RGB LCD的4根控制线配置项,包括CLK、ENABLE、VSYNC和HSYNC。

第37~40行,子节点pinctrl_pwml,LCD背光PWM引脚配置项。这个引脚要根据实际情况设置,这里建议大家在以后的学习或工作中,LCD的背光IO尽量和半导体厂商的官方开发板一致。注意示例代码中默认将LCD的电气属性都设置为 0X79,这里将其都改为0X49,也就是将LCD相关IO的驱动能力改为R0/1,也就是降低 LCD相关IO的驱动能力。因为前面已经说了,正点原子的ALPHA开发板上的LCD接口用了三个SGM3157模拟开关,为了防止模拟开关影响到网络,因此这里需要降低LCD数据线的驱动能力,如果你所使用的板子没有用到模拟开关那么就不需要将0X79改为0X49。

LCD屏幕参数节点信息修改

继续在imx6ull-alientek-emmc.dts文件中找到ledif节点,节点内容如下所示:

 第3行,pinctrl-0属性,LCD所使用的IO信息,这里用到了pinctrl_ledif_dat、pinctrl_ledif_ctrl和pinctrl_ledif_reset这三个IO相关的节点,前两个在示例代码中已经讲解了。pinctrl_lcdif_reset是LCD复位IO信息节点,正点原子的I.MX6U-ALPHA开发板的LCD 没有用到复位IO,因此pinctrl_ledif_reset可以删除掉。

第6行,display属性,指定LCD属性信息所在的子节点,这里为display0,下面就是display0子节点内容。

第9-32行, display0子节点,描述LCD的参数信息,第10行的bits-per-pixel属性用于指明一个像素占用的bit数,默认为16bit。将LCD配置为RGB888模式,因此一个像素点占用24bit, bits-per-pixel属性要改为24。

第11行的 bus-width 属性用于设置数据线宽度,因为要配置为RGB888模式,因此bus-width也要设置为24

第13~30行,这几行非常重要!因为这几行设置了LCD 的时序参数信息,NXP官方的EVK开发板使用了一个4.3寸的480*272屏幕,因此这里默认是按照NXP官方的那个屏幕参数设置的。每一个属性的含义后面的注释已经写的很详细了,大家自己去看就行了,这些时序参数就是重点要修改的,需要根据自己所使用的屏幕去修改。

这里以正点原子的 ATK7016(7寸1024*600)屏幕为例,将imx6ull-alientek-emmc.dts文件中的ledif节点改为如下内容:

 第3行,设置LCD屏幕所使用的IO,删除掉原来的pinctrl_lcdif reset,因为没有用到屏幕复位 10,其他的IO不变。

第9行,使用RGB888模式,所以一个像素点是24bit。

第15-23行,ATK7016屏幕时序参数,根据自己所使用的屏幕修改即可。

LCD 屏幕背光节点信息

正点原子的LCD接口背光控制IO连接到了I.MX6U的GPIO1_IO08引脚上, GPIO1_IO08复用为PWM1_OUT,通过PWM信号来控制LCD屏幕背光的亮度,正点原子IMX6U-ALPHA开发板的LCD背光引脚和NXP官方EVK开发板的背光引脚一样,因此背光的设备树节点是不需要修改的,但是考虑到其他同学可能使用别的开发板或者屏幕,LCD背光引脚和NXP官方 EVK开发板可能不同,因此还是来看一下如何在设备树中添加背光节点信息。

首先是GPIO1_1008这个IO的配置,在imx6ull-alientek-emme.dts中找到如下内容:

 pinctrl_pwm1节点就是GPIO1_1O08的配置节点,从第3行可以看出,设置GPIO1_1008这个IO复用为PWM1_OUT,并且设置电气属性值为 0x110b0。

LCD背光要用到PWM1,因此也要设置PWM1节点,在imx6ull.dtsi文件中找到如下内容:

 imx6ull.dtsi文件中的pwml节点信息大家不要修改,如果要修改pwm1节点内容的话请在imx6ull-alientek-emmc.dts文件中修改。在整个Linux源码文件中搜索compatible属性的这两个值即可找到imx6ull的pwm 驱动文件,imx6ull的PWM驱动文件为

drivers/pwm/pwm-imx.c,这里我们就不详细的去分析这个文件了。

继续在imx6ull-alientek-emme.dts文件中找到向pwm1追加的内容,如下所示:

 第3行,设置pwml所使用的IO为pinctrl_pwm1,也就是示例代码所定义的GPIO1_IO08 这个IO

第4行,将status设置为okay。如果背光用的其他pwm通道,比如pwm2,那么就需要仿照示例代码的内容,向pwm2节点追加相应的内容。pwm和相关的IO已经准备好了,但是Linux系统怎么知道PWM1_OUT就是控制LCD 背光的呢?因此还需要一个节点来将LCD 背光和 PWM1_OUT连接起来。这个节点就是backlight , backlight节点描述可以参考Documentation/devicetree/indings/video/backlight/pwm-backlight.txt这个文档,此文档详细讲解了backlight 节点该如何去创建,这里大概总结一下:

1.节点名称要为“backlight”。

2.节点的compatible属性值要为"pwm-backlight”,因此可以通过在Linux内核中搜索“pwm-backlight”来查找PWM背光控制驱动程序,这个驱动程序文件为

drivers/video/backlight/pwm_bl.c,感兴趣的可以去看一下这个驱动程序。

3.pwms属性用于描述背光所使用的PWM以及PWM频率,比如要使用的pwm1,pwm频率设置为200Hz(NXP官方推荐设置)。

4.brightness-levels属性描述亮度级别,范围为0-255, 0表示PWM占空比为0%,也就是亮度最低,255表示100%占空比,也就是亮度最高。至于设置几级亮度,大家可以自行填写此属性。

5.default-brightness-level 属性为默认亮度级别。

根据上述5点设置backlight节点,这个NXP已经给设置好了,大家在imx6ull-alientekemmc.dts 文件中找到如下内容:

 第3行,设置背光使用pwml, PWM频率为200Hz。

第4行,设置背8级背光(0-7),分别为0、4、8、16、32、64、128、255,对应占空比为0%、1.57%、3.13%、6.27%、12.55%、25.1%、50.19%、100%,如果嫌少的话可以自行添加一些其他的背光等级值。

第5行,设置默认背光等级为6,也就是50.19%的亮度。

使能Linux logo显示

Linux内核启动的时候可以选择显示小企鹅 logo,只要这个小企鹅logo显示没问题那么我们的LCD驱动基本就工作正常了。这个logo显示是要配置的,不过Linux内核一般都会默认开启logo显示,但是奔着学习的目的,我们还是来看一下如何使能Linuxlogo显示。打开Linux内核图形化配置界面,按下路径找到对应的配置项:

图中这三个选项分别对应黑白、16位、24位色彩格式的logo,把这三个都选中,都编译进Linux内核里面。设置好以后保存退出,重新编译Linux内核,编译完成以后使用新编译出来的imx6ull-alientek-emmc.dtb和zImage镜像启动系统,如果LCD驱动工作正常的话就会在LCD屏幕左上角出现一个彩色的小企鹅logo,屏幕背景色为黑色,如图所示:

设置LCD作为终端控制台

一直使用SecureCRT作为Linux开发板终端,开发板通过串口和SecureCRT进行通信。现在已经驱动起来LCD了,所以可以设置LCD作为终端,也就是开发板使用自己的显示设备作为自己的终端,然后接上键盘就可以直接在开发板上敲命令了,将LCD设置为终端控制台的方法如下:

设置uboot中的bootargs

重启开发板,进入Linux命令行,重新设bootargs参数的console内容,命令如下所示:

注意红色字体部分设置console,这里我们设置了两遍console,第一次设置console-tty1,也就是设置LCD屏幕为控制台,第二遍又设置console=ttymxc0,115200,也就是设置串口也作为控制台。相当于我们打开了两个console,一个是 LCD,一个是串口,重启开发板就会发现LCD 和串口都会显示Linux启动log信息。但是此时我们还不能使用LCD作为终端进行交互,因为的设置还未完成。

修改/etc/inittab文件

打开开发板根文件系统中的/etc/inittab文件,在里面加入下面这一行:

 添加完成以后的/etc/inittab 文件内容如图所示:

 修改完成以后保存/etc/inittab并退出,然后重启开发板,重启以后开发板LCD屏幕最后一行会显示下面一行语句:

至此,拥有了两套终端,一个是基于串口的SecureCRT,一个就是我们开发板的LCD屏幕,但是为了方便调试

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

17_LinuxLCD驱动 的相关文章

  • 停止服务时单元陷入故障状态(状态=143)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这是我的问题 我有 CentOS 和 java 进程在上面运行 Java进程是通过启动 停止脚本来操作的 它也创建了 java 实例的 p
  • 无法执行'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
  • 如何在Python中独立于语言安装(linux)获取用户桌面路径

    我找到了 如何找到用户桌面的路径 的几个问题和答案 但在我看来它们都已失效 至少我找到的那些 原因是 如果用户安装的 Linux 不是英语 他或她的桌面很可能位于除 Desktop 例如 对于瑞典语 我相信它是在 Skrivbord 谁知道
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli
  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • Ubuntu 12.04 上的 DeepDive 安装指南

    在拥有以后很多问题 https stackoverflow com questions 22469188 deepdive installation postgresql error安装深潜项目 http deepdive stanford
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • 如何制作和应用SVN补丁?

    我想制作一个SVN类型的补丁文件httpd conf这样我就可以轻松地将其应用到其他主机上 If I do cd root diff Naur etc httpd conf httpd conf original etc httpd con
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • Django + nginx + uwsgi 无法登录

    我有非常简单的登录逻辑 类似于官方 Django 解决方案 class Login FormView template name login html form class AuthenticationForm def get self a
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • 我需要启用哪些权限才能使 Docker 卷正常工作?

    假设我有一个保存一些数据的 Docker 容器 我希望这些数据能够持续存在 如果容器被停止 删除 升级等 我仍然希望数据位于主机操作系统文件系统上的可访问位置 目前 我的解决方案是创建一个目录 srv service name在我的主机上
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案

随机推荐

  • 【iOS】—— APP启动流程

    文章目录 APP启动流程 冷启动和热启动 APP完整的启动流程 1 main函数执行前 系统会做的事 2 main函数执行后 3 首屏渲染完成后 Mach O APP启动流程 冷启动和热启动 冷启动 启动时 App的进程不在系统里 需要开启
  • CSS设置字间距、行间距、首行缩进

    CSS设置字间距 行间距 首行缩进 ps 本人亲测 阿里云2核4G5M的服务器性价比很高 新用户一块多一天 老用户三块多一天 最高可以买三年 感兴趣的可以戳一下 阿里云折扣服务器 字间距 1 text indent设置抬头距离css缩进 即
  • 大数据时代,区块链在数据安全领域有什么样的表现?

    大数据时代之下 一如我们无法抗拒科技进步带来的便捷及欢愉 我们同样也无法避免在享受这一切的过程中留下自己的 数字足迹 正因如此 数据如今已然被纳入企业的战略资源 开始指导决策 成为其提高行业核心竞争力的关键一环 当今的数字化时代 数据可谓是
  • ubuntu18.04安装GPU PyTorch

    转载自这篇文章 安装GPU版本的PyTorch 这里选择用pip进行安装 首先需要安装pip 执行命令sudo apt intall python pip3 该步骤可以跳过 现在建议配置pip虚拟环境 为此我们需要配置virtualenv
  • 一、用 ChatGPT 充当面试官

    目录 一 如何让 ChatGPT 充当面试官 1 1正确使用 1 2 反例 二 模拟面试 2 1 ChatGPT 让我介绍自己 2 2 ChatGPT 提问技术问题 2 2 1 技术问题 2 2 2 下一个问题
  • wifi名称可以有空格吗_但是名称中不能有空格

    Excel表格的每一个单元格都有一个默认的名称 其命名规则是列标加横标 例如A1表示第一列 第一行的单元格 如果要将某单元格重新命名 可以运用以下两种方法 工具 原料 Microsoft Office WPS Office 方法一 1 打开
  • [305]mysql1062错误:Duplicate entry '...' for key 'PRIMARY

    问题解释 Duplicate entry for key PRIMARY 即插入数据时 要插入数据的主键数据 已经存在 不能再重复添加了 例 Duplicate entry 0 for key PRIMARY是指主键为0的数据已经存在 不能
  • Linux常用命令大全(非常全!!!)

    前言 本文特点 授之以渔 了解命令学习方法 用途 不再死记硬背 拒绝漫无目的 准确无误 所有命令执行通过 环境为centos7 拒绝复制粘贴 实用性高 命令多为实际工作中用到的 实例讲解 拒绝纯理论 条理清晰 分类归纳 快速找到想要的命令
  • java疯狂讲义 笔记_《疯狂Java讲义》阅读笔记1

    2 2 UML统一建模语言 从粗粒度到细粒度 最常用的UML图 部署图 从物理处理器和设备的角度画图 其中一个设备中可能包括零个或若干个组件 用例图 表示的是一系列功能 一个用例表示系统的一个功能模块 如登录模块 组件图 多个类共同组成的j
  • OpenGL学习笔记(2)第一个程序——犹他茶壶(Teapot)

    好了 python opengl的开发环境搭建好后 我们就可以开始学习了 这里 我们先学习一个常见的例子 犹他茶壶 先贴代码 from OpenGL GL import from OpenGL GLU import from OpenGL
  • 【ReactNative/JS】uint8array转string convert uint8array to string

    客户端 服务器使用的protobuffer交互 客户端收到的是uint8array 面临着从unit8array转string 我使用的是下面的Crossplatform method Working with node js or oth
  • H3C官网-inode客户端下载

    打开 新华三官网 点击登录 用户名 yx800 密码 01230123 MacOS 安装 iNode Client 的事故与故事 提示 libCoreUtils dylib 将对您的电脑造成伤害 知乎 怎么用mac通过inode上网 知乎
  • js对象获取属性值的方法([]和.方式的不同)

    javascript获取目标对象的属性值 有两种方法 1 通过object key 即 的方式 2 通过object key 即 方式 下面用一个例子来说明 通过 方式获取属性值 key是静态值 即 h value 时 h是没有 为静态值
  • python中的生成器(generator)

    一 生成器 生成器是 Python 中非常有用的一种数据类型 它可以让你在 Python 中更加高效地处理大量数据 生成器可以让你一次生成一个值 而不是一次生成一个序列 这样可以节省内存并提高性能 二 实现generator的两种方式 py
  • js逆向加密五邑大学教务系统密码AES实现模拟登录(仅供参考)

    最近下班无聊 就看了一下之前写的教务系统模拟登录代码 python 爬虫 整体逻辑大概自己总结了一下 1 请求验证码图片 2 对输入的密码进行加密 3 封装账号 密码 验证码 发送post请求 但是在第2步的时候对输入的密码进行加密的过程中
  • 解决Git中fatal: refusing to merge unrelated histories

    Git的报错 在使用Git的过程中有时会出现一些问题 那么在解决了每个问题的时候 都需要去总结记录下来 下次不再犯 一 fatal refusing to merge unrelated histories 今天在使用Git创建项目的时候
  • Python中关于列表list的各种技能整理【定义、增删查改、函数、列表表达式】附练习题

    大家早上好 本人姓吴 如果觉得文章写得还行的话也可以叫我吴老师 欢迎大家跟我一起走进数据分析的世界 一起学习 感兴趣的朋友可以关注我的数据分析专栏 里面有许多优质的文章跟大家分享哦 今天带大家温习的是Python中的列表操作 全篇博文没有难
  • 【数据库学习】数据库平台:Postgres(PG)与PostgreSQL

    中文文档 PostgreSQL 10 6举例 Postgres原理及底层实现 1 安装配置与常见命令 1 安装与配置 安装 yum install https rpm 1 gt 安装目录 bin目录 二进制可执行文件目录 此目录下有post
  • Lim测试平台快速上手教程

    一 数据准备 这里我们将Lim平台作为测试项目 并通过编写一个简单的用例来介绍一下LIm的功能和流程 用例的步骤如下 用户登录 创建项目 修改项目 项目地址 http 121 43 43 59 二 编写用例 大多的接口测试平台都需要用户先维
  • 17_LinuxLCD驱动

    目录 Framebuffer设备 LCD驱动简析 LCD驱动程序编写 LCD屏幕参数节点信息修改 LCD 屏幕背光节点信息 使能Linux logo显示 设置LCD作为终端控制台 Framebuffer设备 先来回顾一下裸机的时候LCD驱动