lcd 移植
- 格式:pdf
- 大小:218.23 KB
- 文档页数:1
(1条消息)STemWin移植目前micrium官网ucgui版本是v5.26Trial版本,无源代码,只有lib文件,现在网上流传最多的源码是ucgui3.90或3.98版本的,这些源码没有完整官方版本。
emWin是segger公司的,segger与ST等公司都有合作,使用ST的芯片可以免费使用emWin,STemWin:,目前版本是5.22。
移植环境:•芯片STM32F103ZET6•TFTLCD驱动芯片ILI9341,带有电阻触屏•编译环境Keil uVision5•不带OS在移植之前,我们应该要有LCD的基本驱动函数,包括初始化、点亮一个像素等(这些驱动文件不能和emWin中的文件重名,即不能命名为LCD.h、LCD.c)。
在文件夹STemWin_Library_V1.1.2中,有以下几个文件:其中Libraries中就有emWin:Config是emWin配置文件Documentation是Segger公司的用户手册inc是头文件Lib是将源码封装成的libOS是带OS和不带OS的GUI文件Software里有一些跟图片、字体相关的实用小工具我们可以将整个STemWin_Library_V1.1.2放入我们的Keil工程中,然后加入以下4个文件:•GUI_X.C:STemWinLibrary522\OS•GUIConf.c,LCDConf_FlexColor_Template.c:STemWinLibrary522\Config•STemWin522_CM3_Keil.lib :STemWinLibrary522\Lib接着我们开始修改文件•GUIConf.c:#define GUI_NUMBYTES 1024*50这个宏定义的含义在于向系统申请一个静态空间aMemory ,接着调用 emWin的库函数GUI_ALLOC_AssignMemory 把该空间分配给 emWin,“1024*50”是50KB的意思。
lcd屏改led屏的方法一、了解LCD屏和LED屏的区别。
1.1 LCD屏也就是液晶显示屏,它本身不发光,得依靠背后的背光模组照亮屏幕。
就像皮影戏得有人在后面打光一样,LCD屏显示效果相对来说柔和一些,但可能在对比度和能耗上有些小问题。
1.2 LED屏呢,它是发光二极管组成的屏幕,自己就能发光。
这就好比是自带小太阳,所以显示效果更明亮、色彩更鲜艳,而且在能耗方面往往表现得更出色。
这就像一个活力满满的年轻人,充满能量。
二、确定设备是否适合改装。
2.1 首先得看看你的设备结构。
有些设备的内部空间就像一个小得可怜的火柴盒,根本塞不下LED屏的相关组件。
这时候你要是硬来,那就是“赶鸭子上架”,根本行不通。
比如说一些超轻薄的笔记本电脑,内部布局紧凑得很,改装难度极大。
2.2 再看看设备的电路系统。
这就好比是人体的血管系统,得给新的LED屏提供合适的“血液”——电力。
如果电路不匹配,就像把小马拉大车,设备可能会出现各种故障,甚至直接罢工。
三、改装的实际操作。
3.1 准备工具和材料。
你得有一套像外科医生做手术的工具,螺丝刀、镊子之类的。
材料嘛,当然就是合适的LED屏啦。
这LED屏可不能随便选,得像挑媳妇一样,要选和你的设备尺寸、接口等各方面都匹配的。
要是选错了,那可就是“竹篮打水一场空”。
3.2 拆卸LCD屏。
这一步可得小心翼翼,就像拆炸弹一样。
先把设备的外壳打开,这外壳就像是设备的盔甲,打开的时候要轻拿轻放。
然后找到固定LCD屏的螺丝和卡扣,把它们一个个松开,再轻轻拔出LCD屏的排线。
这排线就像是屏幕和设备之间的神经,要是弄断了,那可就麻烦大了。
3.3 安装LED屏。
把新的LED屏按照原来LCD屏的位置放好,然后连接好排线。
这就像给设备换了一颗新的心脏,要确保连接得稳稳当当的。
再把固定的螺丝和卡扣都安装好,就像把新的心脏固定在身体里一样。
最后把设备外壳装回去,这时候就像给设备穿上了新衣服。
四、测试与调整。
4.1 开机测试。
Arduino+ESP32之驱动GC9A01圆形LCD(⼆),移植LVGL,跑⽰例程序,显。
在前⽂Arduino+ESP32 之驱动GC9A01圆形LCD(⼀),我们已经移植好了arduino GFX库,该库的⽰例程序内,还有LVGL的⽰例程序哦。
arduino环境下移植lvgl是很⽅便的,我们⼀起来移植⼀个,并且跑⼀下lvgl的⽰例demo!由于arduino的library这个路径内的arduino⼯程⽂件是只读的,不便于我们编译测试⽰例程序,所以我们复制⼀份lvgl的⽰例程序到桌⾯上的我的⼀个⽂件夹内。
打开LvglHelloWorld.ino⼯程⽂件。
⼯具->管理库->库管理器,搜索LVGL并在线安装。
我安装的是8.0.2版本,建议你也安装V8版本的LVGL,因为arduino GFX库的LVGL的⽰例程序是基于V8版本的。
安装好LVGL以后,library路径下会出现lvgl⽂件夹。
复制lvgl⽂件夹内的lv_conf_template.h,我们将其重命名为lv_conf.h,放在library路径下。
为了让lvgl适配我的硬件LCD,我修改了⼏个参数。
⼤部分的SPI 或者IIC的LCD,需要修改的地⽅都是这⼏处。
我修改的地⽅(红⾊箭头所指):1. 跑arduino GFX库的LVGL的⽰例程序,LvglHelloWorld修改LvglHelloWorld.ino⼯程⽂件的三处代码:代码源⽂件:#include <lvgl.h>/******************************************************************************** LVGL Hello World* This is a simple examplle for LVGL - Light and Versatile Graphics Library** Dependent libraries:* LVGL: https:///lvgl/lvgl.git******************************************************************************//******************************************************************************** Start of Arduino_GFX setting** Arduino_GFX try to find the settings depends on selected board in Arduino IDE* Or you can define the display dev kit not in the board list* Defalult pin list for non display dev kit:* Arduino Nano, Micro and more: CS: 9, DC: 8, RST: 7, BL: 6* ESP32 various dev board : CS: 5, DC: 27, RST: 33, BL: 22* ESP32-C3 various dev board : CS: 7, DC: 2, RST: 1, BL: 3* ESP32-S2 various dev board : CS: 34, DC: 26, RST: 33, BL: 21* ESP8266 various dev board : CS: 15, DC: 4, RST: 2, BL: 5* Raspberry Pi Pico dev board : CS: 17, DC: 27, RST: 26, BL: 28* RTL8720 BW16 old patch core : CS: 18, DC: 17, RST: 2, BL: 23* RTL8720_BW16 Official core : CS: 9, DC: 8, RST: 6, BL: 3* RTL8722 dev board : CS: 18, DC: 17, RST: 22, BL: 23* RTL8722_mini dev board : CS: 12, DC: 14, RST: 15, BL: 13* Seeeduino XIAO dev board : CS: 3, DC: 2, RST: 1, BL: 0* Teensy 4.1 dev board : CS: 39, DC: 41, RST: 40, BL: 22******************************************************************************/#include <Arduino_GFX_Library.h>/* More dev device declaration: https:///moononournation/Arduino_GFX/wiki/Dev-Device-Declaration*/#if defined(DISPLAY_DEV_KIT)Arduino_GFX *gfx = create_default_Arduino_GFX();#else /* !defined(DISPLAY_DEV_KIT) *//* More data bus class: https:///moononournation/Arduino_GFX/wiki/Data-Bus-Class*///Arduino_DataBus *bus = create_default_Arduino_DataBus();Arduino_DataBus *bus = new Arduino_ESP32SPI(12/* DC */, 15/* CS */, 14/* SCK */, 13/* MOSI */, -1/* MISO */, HSPI /* spi_num */); /* More display class: https:///moononournation/Arduino_GFX/wiki/Display-Class*///Arduino_GFX *gfx = new Arduino_ILI9341(bus, DF_GFX_RST, 0 /* rotation */, false /* IPS */);Arduino_GFX *gfx = new Arduino_GC9A01(bus, 2/* RST */, 0/* rotation */, true/* IPS */);#endif /* !defined(DISPLAY_DEV_KIT) *//******************************************************************************** End of Arduino_GFX setting******************************************************************************/#define DF_GFX_BL 16/* Change to your screen resolution */static uint32_t screenWidth;static uint32_t screenHeight;static lv_disp_draw_buf_t draw_buf;static lv_color_t *disp_draw_buf;static lv_disp_drv_t disp_drv;/* Display flushing */void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p){uint32_t w = (area->x2 - area->x1 + 1);uint32_t h = (area->y2 - area->y1 + 1);gfx->draw16bitBeRGBBitmap(area->x1, area->y1, (uint16_t *)&color_p->full, w, h);lv_disp_flush_ready(disp);}void setup(){Serial.begin(115200);// while (!Serial);Serial.println("LVGL Hello World");// Init Displaygfx->begin();gfx->fillScreen(BLACK);#ifdef DF_GFX_BLpinMode(DF_GFX_BL, OUTPUT);digitalWrite(DF_GFX_BL, HIGH);delay(100);#endiflv_init();screenWidth = gfx->width();screenHeight = gfx->height();disp_draw_buf = (lv_color_t *)malloc(sizeof(lv_color_t) * screenWidth * 10);if (!disp_draw_buf){Serial.println("LVGL disp_draw_buf allocate failed!");}else{lv_disp_draw_buf_init(&draw_buf, disp_draw_buf, NULL, screenWidth * 10);/* Initialize the display */lv_disp_drv_init(&disp_drv);/* Change the following line to your display resolution */disp_drv.hor_res = screenWidth;disp_drv.ver_res = screenHeight;disp_drv.flush_cb = my_disp_flush;disp_drv.draw_buf = &draw_buf;lv_disp_drv_register(&disp_drv);/* Initialize the (dummy) input device driver */static lv_indev_drv_t indev_drv;lv_indev_drv_init(&indev_drv);indev_drv.type = LV_INDEV_TYPE_POINTER;lv_indev_drv_register(&indev_drv);/* Create simple label */lv_obj_t *label = lv_label_create(lv_scr_act());lv_label_set_text(label, "Arduino-Niceday");lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);Serial.println("Setup done");}}void loop(){lv_timer_handler(); /* let the GUI do its work */delay(5);}烧录代码后的实验效果2.跑lvgl库⾃⾝提供的⽰例代码lvgl⾃⾝提供了很多的example,⽐arduino GFX库的LVGL的⽰例程序要丰富得多,所以我们需要把lvgl⾃⾝提供的⽰例程序跑起来,这样才更有利于学习lvgl。
详解LCD移植1.Make文件设置设置LCDLCD_MODULE = BROADMOBI68_09B_LCM //这个名字可以自己取,但是//这个名字要和\custom\drv\LCD\下的文件夹一致。
//一般可以不用改。
到时直接修改这个文件夹下的代码就行了。
# Based on the LCM solutions (even multiple LCM modules for this project) # SHOULD BE ONE OF THE FOLLOWINGS, based on the LCM# MTKLCM - Mono, 102x64# MTKLCM_COLOR - Color, 120x160, for MT6218_MW001 or MT6205_CEVB# ORDNANCELCM - Mono, 112x64# KLMLCM - Color, 128x128# INFOLCM - Color, 128x128# TOPPOLY_LCM - Color, 128x160, for MT6218B_EVB# SONY_LCMMAIN_LCD_SIZE = 320X480 //查LCD datasheet可以查到分辨率。
# To distinguish the main lcd size.# We can use it to copy the matching resources, such themecomponents.h, Fontres.c, L_xxx.h, etc, to PLUTO_MMI folderSUB_LCD_SIZE = NONE# NONE, 48X64BW, 64X96, 96X64BW, 96X64, 128X128COM_DEFS_FOR_BROADMOBI68_09B_LCM = BROADMOBI68_09B_LCM TFT_MAINLCD //如果//上面的LCD_MOULE设置改了,这个就要跟着该。
⾼通移植mipiLCD的过程LK代码lk部分:(实现LCD兼容)1. 函数定位aboot_init()来到target_display_init();这就是⾼通原⽣lk LCD 兼容的关键所在。
⾄于你需要兼容多少LCD 就在while()设置了,具体代码就不跟下去了。
然后根据target中的不同⽂件来判断是否进⼊哪⼀个函数来处理:target_display_init()函数⾥有很重要函数就是gcdb_display_init();如果平台⽀持屏幕最⼤个数⾃动检测,msm8953⽀持兼容两个屏。
(GCDB:Global Component Database全局组件数据库);gcdb_display_init初始化pll_clk_func、power_func、bl_func等功能(指明相应的函数指针),初始化好之后就调⽤msm_display_init()函数。
在msm_display_init()⾥先Turn on panel,再Turn on backlight;panel.power_func = mdss_dsi_panel_power; //turn on panelpanel.bl_func = mdss_dsi_bl_enable; //turn on backlight函数指向相应的函数中去;2. 打开lcd/* Turn on panel */1. 调⽤mdss_dsi_panel_power()中的regulator_enable()给L2、L6、L17供电if (pdata->power_func)ret = pdata->power_func(1, &(panel->panel_info));2. 调⽤mdss_dsi_mipi_dfps_config函数:if (pdata->dfps_func)ret = pdata->dfps_func(&(panel->panel_info));3. 调⽤mdss_dsi_panel_clock()调⽤calculate_clock_config(pinfo)计算时钟配置和调⽤target_panel_clock(enable, pinfo)配置⽬标panel的时钟。
TFT-LCD技术简介TFT-LCD技术1 TFT LCD技术发展历史晶体管的发明对半导体⾏业来说,是个划时代的事件。
作为晶体管的⼀种,TFT的发明是在与LCD没有任何联系的情况下发⽣的。
1971年,虽然有⼈提出⽤TFT驱动LCD的概念,但是并没有引起⼈们的注意。
直到1979年,开发出了TFT LCD,但是当时由于⽤⽆源矩阵的⽅法也可以驱动100条左右的扫描线,因此还是很多⼈对TFT LCD没有看好。
在LCD画⾯的数⼗万个画素上都作TFT,在当时的半导体技术⽔平来看,简直是“痴⼈做梦”。
进⼊80年代以后,在TN模式LCD上很难实现显⽰更多信息量的要求,因此很多⼈(LCD技术⼈员,⽽不是半导体技术⼈员)在液晶材料和液晶模式上想找出答案。
1983年左右,⼈们终于找到了答案—新的液晶模式STN LCD。
由于STN模式⾮常巧妙的解决了TN模式在100条扫描线以上出现画质急剧下降的问题,整个LCD业界⼏乎都投⼊到STN技术开发和产品开发。
80年⼤后期,市场上⼤量出现了STN产品,还出现了类似于笔记本电脑的⽂字处理器(Word Processor)。
但是对于彩⾊化、液晶电视等新的需求,STN模式显然⼒不从⼼(响应速度慢,灰度表⽰较困难)。
很多技术⼈员开始转向新的解决⽅法。
虽然TFT LCD 的技术开发没有停⽌过,但是整个LCD业界开始把⽬光转向TFT LCD还是上个世纪80年代中期以后的事。
上个世纪80年代正好是⽇本半导体⾏业的全盛期,⽽且⽐较有趣的是⼏乎所有的拥有半导体部门的⽇本企业都参与了TFT LCD产业。
因为TFT的⼯艺与DRAM有很⼤的类似性,因此虽然没有LCD的技术储备,⽇本很多半导体企业还是参与了这个⾏业。
其实韩国的三星电⼦、LG飞利浦、现代都拥有或拥有过半导体部门;台湾的TFT LCD企业(友达)也与半导体有关系。
下⾯的两个表各⾃描述TFT的技术发展史和LCD的技术发展史。
在1971年TFT技术和LCD技术曾经有过交点,但是没有“成功”的结合;到了1981年开始这两个技术才真正结合并开始发芽开花了。
基于STM32的LCD操作STM32的LCD操作是通过使用外部的液晶显示器(Liquid Crystal Display,简称LCD)模块来实现的。
以下是一个基于STM32的LCD操作的详细解释,包括液晶显示器的初始化、数据和命令的发送、以及常用的LCD操作函数。
LCD初始化:1.首先,配置GPIO引脚用于连接到LCD模块的数据线和控制线。
3.然后,发送各种初始化命令,如清除显示、设置光标等。
数据和命令的发送:1.向LCD发送数据(字符或图形数据)时,需要确保LCD处于数据接收状态,而不是指令接收状态。
通常需要在发送数据之前发送一个命令来设置LCD的模式为数据接收模式。
2.通过配置GPIO引脚的电平来发送数据或命令。
常用的LCD操作函数:1. `lcd_init(`: 初始化LCD模块。
2. `lcd_cmd(uint8_t cmd)`: 向LCD发送一个命令。
3. `lcd_data(uint8_t data)`: 向LCD发送一个数据。
4. `lcd_clear(`: 清除LCD显示内容。
5. `lcd_set_cursor(uint8_t row, uint8_t col)`: 设置LCD显示的光标位置。
6. `lcd_print(char *str)`: 在LCD上打印一个字符串。
7. `lcd_create_custom_char(uint8_t location, uint8_t *data)`: 创建自定义字符。
8. `lcd_display_on(`: 打开LCD显示。
9. `lcd_display_off(`: 关闭LCD显示。
上述函数只是基本的示例,具体的函数实现会因不同的液晶模块而有所不同。
在编写代码时,需要根据液晶模块的规格和数据手册来设置相应的GPIO引脚和参数。
总之,基于STM32的LCD操作涉及到GPIO引脚的配置、LCD控制器的初始化、发送数据和命令等步骤。
通过熟悉液晶模块的规格和使用相关的库函数,可以实现对LCD模块的控制。
一、编译:1、cd /home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5ls2、source build/envsetup.shlunch3、KONKA_D7-userdebug或者P5_Russia-userdebug(通用版本)4、kheader5、全部编译make -j8 2>&1 | tee build.log部分编译(改代码时)make bootloader -j8 2>&1 | tee build.logmake bootimage -j8 2>&1 | tee build.log二、克隆:三、下载:1、out/target,考出pac文件,boot.img和u-boot.bin,加载pac文件,然后下载2、每次改完代码,需要重新编译,并且加载pac文件四、改时序:lcd_ili9881c_mipi_1491sl_p5_qc.c里面改五、重新编译:重新编译完,删除/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/out/target/product/1491sl_p5_ hd/obj/u-boot64/drivers/video/sprdfb/lcd目录下的文档六、屏的调试1、LCD驱动初始化,各寄存器的含义。
2、通道数要对应,lan.number和0X80的值,01代表2通道,02代表3通道,03代表4通道七、摄像头增加新型号1、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/vendor/sprd/modules/libcamer a/sensor中的Sprdroid.mk中增加local_src_files目录(先要把驱动文件拷过来,打开驱动文件里边的.c查看变量名称,与文件名无关,与路径有关)2、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/vendor/sprd/modules/libcamer a/oem2v0/src中的sensor_cfg.c中增添型号(对照已有的型号格式)3、改完之后编译systemimage,编译过程或错误查看build.log4、调试摄像头时,如果通信不成功,先检查是否接触不良八、adb devices读不到1、网上做法加设备ID2、检查adb环境是否配置好3、重新下载一次系统九、adb shelladb logcat > '/home/android/test.log' 抓取操作流程日志十、打包1、代码:运行imgpac:cd /home/android/gmk/test/983x_NATIVE_6_s801然后./imgpac(打包程序)2、手动打包:用ReseachDownload点击packet十一、无法对焦1、将#define CONFIG_CAMERA_AUTOFOCUS_NOT_SUPPORT注释掉,目录为/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/vendor/sprd/modules/libcamer a/sensor/gc5025_1713_KONKA_D7十二、新增LCD1、在kernel和uboot中加入驱动代码.c文件2、在驱动所在目录的Makefile中加入语句obj-$(CONFIG_FB_LCD_JD9365_MIPI) += $(filter lcd_jd9365_mipi_%,$(CTL_LCD)).o3、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/u-boot64/drivers/video的sprdfb_panel.c中加:#ifdef CONFIG_FB_LCD_JD9365_MIPI{.lcd_id = 0x9365,.panel = &lcd_jd9365_mipi_spec,},#endif4、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/kernel/arch/arm/configs的deconfig中加CONFIG_FB_LCD_JD9365_MIPI=y5、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/device/sprd/scx35l/1491sl_p5 _hd/project中的P5_Russia.mk中改CTL_LCD6、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/u-boot64/include/configs 的1491SL.h中加#define CONFIG_FB_LCD_JD9365_MIPI7、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/kernel/drivers/video/sprdfb 的Kconfig中添加:config FB_LCD_JD9365_MIPIboolean "support JD9365 mipi panel"depends on FB_SC8825 || FB_SCX35 || FB_SCX15 || FB_SCX30G || FB_SCX35Ldefault n8、新加之前注意将之前的lcd屏蔽掉(deconfig和configs都要注释掉),或加在前面,以免遍历编译时出错“未找到创建规则创建所需的.o文件”9、注意u-boot和kernel驱动代码不完全相同,分开改,以免出错“函数未定义”10、屏不亮时,先检查是否电池没电11、图像偏大或者点的位置与触屏不符,考虑频率密度,修改/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/device/sprd/scx35l/1491sl_p5 _hd中的system.prop中的ro.sf.lcd_density,854*480为24012、开机白屏,检查初始化,很有可能13、编译出错时,先检查error错误,有可能是头文件的事(直接复制过来的头文件可能有错,可参考其他lcd的代码)14、检查out/obj,看kernel和u-boot有没有编译进去15、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/device/sprd/scx35l/1491sl_p5 _hd/modem_bins里放的是开机画面logo,图片的分辨率是固定的16、很多行出现错误时,检查大括号是不是漏掉一个十三、修改LCD读ID 部分代码1、看规格书,ID存在哪个寄存器内2、按照已有的格式改修代码十四、查看LCD_id1、adb shell进入环境2、adb root3、cat /proc/cmdline十五、1、任务:兼容10802和7701两个屏2、新增lcd见上述步骤3、这两个屏分辨率为854*480,为FWVGA,需在/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/u-boot64/include/configs里修改FWVGA和720p的顺序4、出现的错误:1)u-boot没有编译进去:按build.log先修改error,本项目出错为configs与Makefile大小写不一致2)头文件出错3)修改开机logo,分辨率不符十六、修改开机动画1、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/device/sprd/scx35l/1491sl_p5 _hd/power中拷取两个压缩包,压缩包里是开机连续动画图片,可以替换根据分辨率2、/home/android/gmk/test/983x_NATIVE_6_s801/device/sprd/scx35l/S801/project 对应修改密度值ro.sf.lcd_density=320 \3、/home/android/gmk/test/983x_NATIVE_6_s801/out/target/product/S801/system删除build.prop4、替换/home/android/gmk/test/983x_NATIVE_6_s801/device/sprd/scx35l/S801/thirdparty/S 801G_M506/power中的压缩包用于调用十七、出现libsepol.context_from_record: type bl229x_device is not defined错误,查找/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/device/sprd/scx35l/common/s epolicy中的file_contexts文件,改相应bl229x_device十八、设备树1、dts讲解:/hbk320/article/details/468445852、代码目录:/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/kernel/arch/arm/boot/dts十九、编译分支的deconfig1、=m和=y的含义:首先需要知道:obj-m = *.oobj-y = *.o上面两者的区别在于,前者才会生成ko文件,后者只是代码编译进内核,并不生成ko文件。
LCD大屏安装方案1. 简介这份文档提供了一份LCD大屏安装的方案,旨在指导安装人员正确、高效地安装大屏。
2. 安装步骤2.1 准备工作在开始安装之前,先进行如下准备工作:- 根据大屏尺寸,选择适合的安装位置,并确保墙面或支架能承受大屏的重量。
- 检查所需安装工具和材料是否齐全:螺丝刀、扳手、支架、螺丝、墙钉等。
2.2 安装支架1. 根据大屏尺寸和重量,选择合适的支架类型。
2. 确保支架的强度和稳定性,并按照制造商提供的说明进行支架安装。
3. 安装支架时,注意保持水平和垂直方向的准确性。
2.3 连接电源和信号线1. 确保有足够的电源插座供大屏使用,并预留适当的余量。
2. 根据大屏的输入接口类型,选择合适的信号线,并将其插入大屏相应的接口。
3. 将信号线连接到输入源(如电脑、DVD播放器等)。
2.4 挂载LCD大屏1. 将LCD大屏轻轻放置在安装好的支架上,并确保与支架连接牢固。
2. 调整大屏的水平度和垂直度,确保画面正常显示。
3. 通过拧紧螺丝或紧固扳手,将大屏稳固地固定在支架上。
2.5 调整设置1. 打开大屏并连接电源。
2. 根据大屏的使用说明书,调整亮度、对比度、色彩等参数,以获得最佳的视觉效果。
3. 注意事项- 安装过程中,要避免碰撞和摔落,以防损坏大屏。
- 在安装过程中,注意个人安全,避免发生电击、摔伤等意外事故。
- 如遇到疑难问题或无法解决的情况,及时请专业人士提供帮助。
4. 总结通过按照本安装方案的步骤进行操作,您将能够正确、高效地安装LCD大屏。
请确保在操作过程中遵循安全规范,以确保顺利完成安装任务。
请注意,这份文档旨在提供安装指导,并不涉及法律问题或复杂内容。
lcd模块移植需要注意的事项
在移植LCD模块时,需要注意以下几个事项:
1. 芯片驱动:选择适合目标平台的芯片驱动,确保与LCD模块兼容。
2. 电源:为LCD模块提供稳定的电源,以确保正常工作。
尤其是在需要高亮度显示或启用背光的情况下,电源供应的稳定性尤为重要。
3. 数据接口:根据LCD模块的接口类型(如SPI、I2C、并行等),确保正确连接和配置数据接口。
4. 分辨率和颜色深度:根据LCD模块的分辨率和颜色深度,进行正确的配置。
确保将图像数据和像素点映射到正确的位置和颜色。
5. 显示控制器:一些LCD模块需要外部显示控制器来管理显示操作,确保正确选择和配置适合的控制器。
6. 初始化和配置:在移植过程中,需要进行LCD模块的初始化和配置工作。
根据具体的LCD模块和驱动,设置合适的参数和选项,以确保正确的显示。
7. 坐标映射:在一些LCD模块中,像素坐标的映射方式可能与目标平台不同。
需要进行相应的坐标转换工作,以确保正确的显示。
8. 响应时间:LCD模块的响应时间通常较慢,特别是在刷新
或变化较大的图像时。
在移植过程中,需要考虑这一点,并做出相应的处理,以避免延迟和卡顿。
9. 驱动程序:根据移植的平台和需求,编写合适的驱动程序来操作和控制LCD模块。
确保驱动程序的稳定性和可靠性。
10. 测试和调试:在移植完成后,进行相关的测试和调试工作,确保LCD模块的正常工作并达到预期的效果。
12864LCD液晶显示原理及使用方法液晶简介液晶是一种在一定温度范围内呈现既不同于固态液态又不同于气态的特殊物质态,它既具有各向异性的晶体所特有的双折射性又具有液体的流动性液晶显示器件(英文的简写为LCD)就是利用液晶态物质的液晶分子排列状态在电场中改变而调制外界光的被动型显示器件。
点阵式图形液晶显示屏是LCD 的一种能够动态显示图形汉字以及各种符号信息为各种电子产品提供了友好的人机界面点阵式图形液晶显示屏的主要特点如下(这些特点也就是LCD 的特点):工作电压低、微功耗、体积小、可视面积大、无电磁辐射、数字接口、寿命长等特点。
12864LCD是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64 全点阵液晶显示器组成。
可完成图形显示,也可以显示8×4 个(16×16 点阵)汉字或者显示16×4个(8×16 点阵)ASCII码。
分为两种,带字库的和不带字库的。
不带字库的LCD需要自己提供字库字模,此时可以根据个人喜好设置各种字体显示风格,设计上较为灵活。
带字库的LCD 提供字库字模,但是只能显示GB2312的宋体。
各有优缺点,根据不同应用场景灵活选择。
其液晶模块原理图如下所示。
12864LCD点阵图形液晶模块原理框图下面给出了其应用连接电路,分别介绍其各引脚的功能和作用。
如下表所示:12864LCD 的引脚说明管脚号管脚名称LEVER 管脚功能描述1GND 0 电源地2VCC+5.0V 电源电压3VLCD - 液晶显示器驱动电压4RS (D/I) H/LD/I=“H”,表示DB7∽DB0 为显示数据D/I=“L”,表示DB7∽DB0 为显示指令数据5R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0R/W=“L”,E=“H→L”数据被写到IR 或DR 6EN H/L R/W=“L”,E 信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRAM 数据读到DB7∽DB08DB1 H/L数据线9DB2 H/L 数据线10DB3 H/L 数据线11DB4 H/L数据线12DB5 H/L数据线13DB6 H/L数据线14DB7 H/L数据线15CS1 H/L H:选择芯片(右半屏)信号16CS2 H/L H:选择芯片(左半屏)信号17RET H/L复位信号,低电平复位18VEE -10VLCD 驱动负电压19LED+ - LED 背光板电源20LED- - LED 背光板电源12864LCD点阵图形液晶模块应用连接电路液晶驱动设置在理解12864LCD硬件原理和管脚功能之后,可以针对LCD进行驱动的编写,分两种情况:仿真环境下和实物开发板编程。
基于展讯平台下调LCD各文件路径关联总结以下各层为从上往下调用关系:用户空间——>内核空间——>硬件一、用户空间——应用程序二、内核空间:1)kernel/driver/video/fbmem.c(母目录,一律注册字符设备,不针对平台)作用:a. 定义结构体file_operations包括fb_read()、fb_write()、fb_ioctl()等b. 在module_init()初始化时,调用register_chrdev(FB_MAJOR,"fb",&fb_fops)函数传递该该结构体以注册字符设备。
如下图:2)kernel/driver/video/sc8810(视平台而定)/sprdfb_main.c(一般为XX fb_main.c) 作用:注册framebuffer(调用函数在fbmem.c内定义)、注册平台设备作用:a. 定义结构体platform_driver包括probe、suspend、resume等b.在module_init()初始化时,调用platform_driver_register(&sprdfb_driver)函数传递该结构体“针对该平台”进行平台驱动注册。
如下图:c. 在该结构体内成员probe函数里调用register_framebuffer(fb)注册framebuffer,且在probe探测函数里“针对该平台”进行硬件初始化、申请帧缓冲空间等。
//********************************************//********************************************注释:sprdfb_main.c会调用同个目录下lcdc.c文件下函数,进行ID的枚举等,具体参考前一章。
1)通过lcdc.c的find_adapt_from_readid()函数(uboot下也有)会在kernel 下重新枚举设备(如果uboot枚举不通过返回-1)如下图2)find_adapt_from_readid()和find_adapt_from_uboot区别如下,其中find_adapt_from_readid()会重新枚举panel如下图灰色区域3)a. 图中lcd_panel_size即为枚举数量,函数位置为:/customize/cutomer_cfg/sp8810ga/kernel/lcd/lcd_cfg.c或/u-boot/drivers/video/sc8810_fb.c如下图定义:b. 其中平台设备函数位置为:/3rdparty/lcd/lcd_ili9486kernel/lcd_ili9486.c或/u-boot/board/spreadtrum/sp8810/lcd_ili9486.c如下图定义:c. lcd_operations结构体定义如下://********************************************三、硬件——LCD控制器备注:LCD平时运行函数(属于fb_ops、lcd_operations的ops操作函数,为上层软件调用执行):<4>[ 39.549000] sprdfb pan_display!!,fb_state=0<4>[ 39.549000] hx8369_invalidate_rect : (0, 0, 479, 799)<4>[ 39.549000] hx8369_set_window在kernel读ID如果读取不对,会使fb_state置1,即通过不了sprdfb pan_display(),一直在调用该函数而不执行hx8369的函数。
基于STM32的LCD操作在STM32系列微控制器中,通常使用GPIO口来与LCD进行通信。
以下是实现STM32与LCD操作的一般步骤:1.连接硬件:-连接STM32的GPIO口与LCD的数据线,用于传输数据。
-连接STM32的GPIO口与LCD的控制线,用于控制读写操作。
-连接STM32的GPIO口与LCD的使能线,用于使能LCD。
2.配置GPIO:-使用STM32的寄存器来配置相应的GPIO口,将其设置为输出模式。
-设置GPIO口的驱动能力,确保能够将足够的电流传输到LCD。
3.初始化LCD:-发送初始化命令到LCD,初始化其内部寄存器和设置显示模式。
-确定LCD的工作电压和时序,设置相应的寄存器参数。
4.发送数据到LCD:-设置控制线的状态(如RS、R/W和EN)来指示将要发送的数据类型(指令还是数据)。
-将数据通过数据线发送到LCD,通常是通过一个存储器映射的寄存器。
-根据LCD的特性,可能需要发送多个字节的数据或者使用特殊的数据格式(如帧缓冲)。
5.控制LCD的操作:-使用相应的指令来控制LCD的显示模式,如清屏、设置光标位置、显示字符等。
-根据需要,可以实现自定义的功能,如绘制图形、显示动画等。
6.关闭LCD:-在使用完毕后,可以发送相应的指令将LCD置于睡眠或关闭状态,以节省功耗。
-断开与LCD的通信连接,释放相关的资源。
在实际的应用中,还需要考虑以下几个方面:-适配不同型号的LCD:不同型号的LCD可能有不同的控制指令和时序要求,需要针对特定的型号进行设置和适配。
-优化显示效果:可以根据具体需求,使用合适的字体和颜色,以及优化渲染算法、缓冲区管理等来提升显示效果和性能。
-操作LCD的并发性:在多任务的环境下,可能需要使用互斥锁或其他同步机制,以确保多个任务同时操作LCD时不会发生冲突。
-处理异常情况:在操作LCD的过程中,可能会出现异常情况,如通信错误、显示故障等,需要进行相应的错误处理和恢复操作。
LCD调试1、首先,驱动的移植。
涉及函数mx2fb.c , mxcfb_modedb.c, 修改一点设置情况,具体可参看毋杰的“LCD 的调试笔记”。
然后编译内核,用secureCRT下载到开发板上,开机后先是白屏,一会左上角会显示一个小企鹅的logo 。
测试:在secureCRT窗口下,敲入命令cp xxx.bin /dev/fb0 , 即可显示图片。
(xxx.bin 是所要显示图片的二进制文件,可以用Img2Lcd软件转换)参考:linux_user_guide2、其次,应用程序编写。
框架:int main(int argc,char *argv[]){ int fbfd = 0;long int screensize = 0;/*打开设备文件*/fbfd = open("/dev/fb0", O_RDWR);if (fbfd < 0){ printf("Unable to open /dev/fb0\n");return(1);}/*取得屏幕相关参数*/ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo);ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo);vinfo.bits_per_pixel = 16; vinfo.yoffset = 0;ioctl(fbfd, FBIOPUT_VSCREENINFO, &vinfo);/*计算屏幕缓冲区大小*/screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;/*通过mmap函数映射屏幕缓冲区到用户地址空间*/fb_mem=(char*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED, fbfd, 0);if(fb_mem==NULL){printf("mmap failed\n");close(fbfd);return -1;}/*下面可通过fbmem指针读写显示设备缓冲区*/memset (fb_mem, 0x0, screensize);printf(" show_bmp \n");paint_Bmp24(width,height,gImage_flower24);munmap(fb_mem,screensize); /*可用munmap函数删除显存区的数据*/close(fbfd); /*关闭设备*/return 0;}显示图片A)将图像文件转换成c数组(Img2Lcd软件),程序里直接调用。
MTK平台LCD驱动过程详解
首先,MTK平台LCD驱动的基本任务是将图像数据转换为可显示的信号,并通过LCD控制器将信号传输到液晶显示器上。
这个过程主要包括以下几个步骤:
1.初始化:在驱动LCD之前,需要对LCD控制器进行初始化设置。
这些设置包括选择LCD接口类型、设置像素时钟频率、配置数据线数目、设置显示像素点数等。
初始化完成后,LCD控制器就可以根据这些设置来控制LCD的操作。
2.数据处理:接下来,驱动程序需要将图像数据转换为LCD可以接受的格式。
这个过程可以包括调整图像数据的位深度、颜色格式、调整图像的分辨率等。
转换完成后,图像数据就可以传输到LCD控制器。
3.数据传输:在传输数据之前,驱动程序需要根据像素时钟频率和数据线数目等参数,计算出每一行数据需要的传输时间。
然后,通过LCD控制器将图像数据按行传输到LCD上。
传输完成后,LCD控制器会自动将数据驱动到液晶显示器的每一个像素点上。
4.功能控制:在数据传输的同时,驱动程序还需要控制LCD的各种功能,如背光控制、电源管理、色彩校正等。
这些功能控制可以通过编程接口进行设置。
5.刷新显示:一旦将图像数据传输到液晶显示器上,驱动程序可以根据需要定期刷新显示图像。
刷新可以通过设置刷新频率、调整显示内容等方式进行。
总的来说,MTK平台LCD驱动的过程可以分为初始化、数据处理、数据传输、功能控制和刷新显示等几个步骤。
通过这些步骤,驱动程序可以
将图像数据转换并传输到液晶显示器上,实现图像的显示功能。
这些步骤需要通过编程接口和LCD控制器进行交互,以完成LCD驱动的过程。
LCD驱动移植及测试
TQ2440 LCD硬件
东华TFT液晶屏(WXCAT35),配置为常用的16BPP(5:6:5)模式。
参数如下图所示:
static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
.type = S3C2410_LCDCON1_TFT,
.width = 320,
.height = 240,
.pixclock = 100000, //????/*HCLK 100MHZ divisor 3*/
.xres = 320,
.yres = 240,
.bpp = 16,
.left_margin = 20,
.right_margin = 38,
.hsync_len = 30,
.upper_margin = 12,
.lower_margin = 15,
.vsync_len = 3,
};
关于pixclock=1/VCLK,像素时钟,单位是皮秒。
显示每个像素的时钟周期。
和cpu的HCLK有关。
16BPP模式的数据格式
以上参考:2440LCD控制器详细配置
linux内核配置
Device drivers-> Graphics support ---> Support for frame buffer devices ---> S3C2410 LCD framebuffer support
测试程序
参考:linux framebuffer tutorial
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
int lcd_width;
int lcd_height;
int screen_size;
int line_size;
struct fb_var_screeninfo var_screeninfo;
struct fb_fix_screeninfo fix_screeninfo;
void get_screeninfo(int fb,struct fb_var_screeninfo *var,struct fb_fix_screeninfo *fix)
{
if(ioctl(fb,FBIOGET_VSCREENINFO,var))
{
fprintf(stderr,"ioctl FBIOGET_VSCREENINFO.\n");
exit(1);
}
if(ioctl(fb,FBIOGET_FSCREENINFO,fix))
{
fprintf(stderr,"ioctl FBIOGET_VSCREENINFO.\n");
exit(1);
}
lcd_width=var->width;
lcd_height=var->height;
screen_size=lcd_width*lcd_height*var->bits_per_pixel/8;
line_size=fix->line_length;
printf("var->width:%d\n",var->width);
printf("var->height:%d\n",var->height);
printf("var->bits_per_pixel:%d\n",var->bits_per_pixel);
printf("var->xoffset:%d\n",var->xoffset);
printf("var->yoffset:%d\n",var->yoffset);
printf("fix->line_length:%d\n",fix->line_length);
}
void draw_rect(char *fbp,int x,int y,int w,int h,short color)
{
int i,j;
for(i=0;i<w;i++)
for(j=0;j<h;j++,j++)
*(fbp+i*line_size +y+j)=color;
}
void draw_screen(char *fbp)
{
draw_rect(fbp,0,0,80,80,0xf800);
draw_rect(fbp,80,80,80,80,0x07e0);
draw_rect(fbp,160,160,80,80,0x001f);
}
int main()
{
int fb;
int cmd;
unsigned char *fb_mem;
if((fb=open("/dev/fb0",O_RDWR))<0)
{
printf("cannot open /dev/fb0\n");
exit(0);
}
get_screeninfo(fb,&var_screeninfo,&fix_screeninfo);
fb_mem=(unsigned char*)mmap(0,screen_size,PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);//关键!!!把内核空间映射到用户空间
if ((int)fb_mem == -1)
{
printf("Error: failed to map framebuffer device to memory.\n");
exit(4);
}
printf("The framebuffer device was mapped to memory successfully.\n");
memset(fb_mem,0,screen_size);
/*do something here use fb_mem*/
draw_screen(fb_mem);
munmap(fb_mem, screen_size);
close(fb);
return 0;
}
交叉编译:arm-linux-gcc lcdtest.c -o lcdtest
测试结果:
系统启动加载framebuffer驱动:
运行测试程序:
问题:LCD一段时间后会自动关闭,解决方案参考:十分钟黑屏问题。