This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

增加Uboot的logo显示 & 增加Uboot自定义命令控制LCD

 AM335x 在Uboot增加自定义的命令控制LCD功能.pdf

 

本文的内容如下:

一. 简单介绍一下AM335x的时钟域的概念,然后讲解如何配置LCDC的时钟

二. 讲解LCDC的寄存器的内容和如何根据所选的LCD屏的特性进行时序上的配置

三. 介绍用bmpToRaster tools 将任意图片生成十六进制的数据数组

四. 在新版本的processor SDK v3.0中,在uboot阶段实现增加LCD 的logo显示

五. 基于第四点内容,增加Uboot的命令,效果是在Uboot进入命令模式,使用自定义的命令控制LCD屏的开、关和复位

 

      如果对AM335x的LCD时序以及LCD配置流程清楚的读者,可以跳过一二三章的内容,直接阅读四五章LCD在Linux的Uboot阶段的配置流程。

以上,如有任何疑问或者建议,欢迎大家随时发表、讨论!谢谢

 

  • 第四章Uboot阶段显示logo的配置流程(需要用到的文件---lcd drive)

    1.下载该处提供的LCD的drive——文件夹名“lcd”,将其放到u-boot/drivers文件夹里

    2.   定义相关宏

    3.   配置Display PLL

    4. 定义LCD初始化函数

  • 第五章所用到的文件lcd_cmd.c

    这章内容主要是通过增加自定义的uboot的命令实现对LCD的控制,步骤如下

    1.在u-boot/cmd文件里,添加lcd_cmd.c文件

    2.打开u-boot/cmd/Makefile文件,在如下位置添加一句obj-y += lcd_cmd.o ,确保lcd_cmd.c文件被编译

    。。。。。。



    效果展示:

    .


  • 您好,

    4505.lcd 这个压缩包里面的 rasterDisplay.c 有些函数不全。 文章里面,写着 Rasterdisplay.c 里面的主要函数有 : int Lcd_Init(void),void Lcd_reset(),void Lcd off(), void Lcd_ofn().但是,rasterDisplay.c 只有 void Lcd_Init(void) 和  static void SetUpLCD(void),并没有  void Lcd_reset(),void Lcd off(), void Lcd_ofn()

  • 不好意思,之前上传了旧版本的LCD drive,下面这个有的,更新了一下:

  • 谢谢,

    这个方法对于beagle bone  black 适用吧?

  • 当然, 这个方法都适用于AM335x平台

  • board/ti/am335x/built-in.o:在函数‘lcdbacklight_off’中:
    /home/cason/src/projects/bbb_third/ti-u-boot/board/ti/am335x/board.c:561:对‘Lcd_off’未定义的引用
    board/ti/am335x/built-in.o:在函数‘lcdbacklight_on’中:
    /home/cason/src/projects/bbb_third/ti-u-boot/board/ti/am335x/board.c:570:对‘Lcd_on’未定义的引用
    board/ti/am335x/built-in.o:在函数‘board_lcd_reset’中:
    /home/cason/src/projects/bbb_third/ti-u-boot/board/ti/am335x/board.c:578:对‘Lcd_reset’未定义的引用
    board/ti/am335x/built-in.o:在函数‘board_init’中:
    /home/cason/src/projects/bbb_third/ti-u-boot/board/ti/am335x/board.c:592:对‘Lcd_Init’未定义的引用
    arm-linu

    在 ./drivers/lcd/rasterDisplay.cpp 中定义的这些函数,是不是应该放到一个头文件中,让board.c 包含呢?

    drivers/lcd/rasterDisplay.c:43:23: fatal error: evmAM335x.h: 没有那个文件或目录
    compilation terminated. 修改了一下, 变成 evmskAM335x.h 就好了. 

  • drivers/built-in.o:在函数‘Lcd_reset’中:
    /home/cason/src/projects/bbb_third/ti-u-boot/drivers/lcd/rasterDisplay.c:85:对‘RasterSoftWareClkDisable’未定义的引用
    /home/cason/src/projects/bbb_third/ti-u-boot/drivers/lcd/rasterDisplay.c:86:对‘RasterDMASoftWareClkDisable’未定义的引用
    /home/cason/src/projects/bbb_third/ti-u-boot/drivers/lcd/rasterDisplay.c:88:对‘RasterSoftWareResetControlEnable’未定义的引用
    arm-linux-gnueabi-ld.bfd: BFD (GNU Binutils for Ubuntu) 2.26.1 断言失败 ../../bfd/elf32-arm.c:8437

  • 这几个函数根本没有定义啊

  • 这几个函数就在raster.c里面,不知道您是否找到呢?

  • 谢谢您的回复.我在您发的 4137.lcd.zip 中没有找到对应的函数.能不能请您上传一个最新的lcd 目录的包?

  • 你看一下下载下面可以不?我这边试过没问题

  • 比较了一下,您新发的包跟之前的包还是有区别的.另外,能不能发一下 board/ti/am335x/board.c 呢?

    现在在报 

    对‘Lcd_off’未定义的引用

    我在这个文件中包含了头文件 rasterDisplay.h 

    #include "../../../drivers/lcd/rasterDisplay.h"

  • => ULCD
    Unknown command 'ULCD' - try 'help'

    看到文件已经编译了,不明白为什么命令找不到.

  • 现在终于可以让LCD能显示东西了,但是现在还有一个问题不能解决:

    1. 我的屏幕分辨率是800*480, 生成image.h 后, 最后编译出来的u-boot.img 有786k. 不加图片的时候大概是367K.

    $ ./myburn.sh
    sudo dd if=MLO-am335x_boneblack-v2016.11-3-gf2fb808-r0 of=/dev/sdc count=1 seek=1 conv=notrunc bs=128k

    记录了0+1 的读入
    记录了0+1 的写出
    68592 bytes (69 kB, 67 KiB) copied, 0.00140823 s, 48.7 MB/s
    sudo dd if=u-boot-am335x_boneblack-v2016.11-3-gf2fb808-r0.img of=/dev/sdc count=2 seek=1 conv=notrunc bs=384k

    记录了2+0 的读入
    记录了2+0 的写出
    786432 bytes (786 kB, 768 KiB) copied, 0.0011435 s, 688 MB/s

    烧到USB上去以后, u-boot 不能启动, 试图使用eMMC来启动(eMMC已经全部删掉了, 所以无法启动) 

    U-Boot SPL 2016.11-00003-gf2fb808-dirty (Jan 01 2017 - 11:37:29)
    Trying to boot from MMC1

    2. 我用了一个小的图片, 300*200 . 生成image.h, 其它参数不变,  屏幕上有疑似图片在展示,但是是扭曲的, 看不清东西.

    所以,想请教一下, 是不是 u-boot image 有大小限制啊, 您附在源文件中的image.h 看起来大的多,有没有遇到U BOOT 无法启动的问题?

    谢谢支持,祝元旦快乐.

  • 现在是全部编译通过了对吗?我这边Uboot 3M都可以启动,不知道您能不能把遇到的所有问题总结一下,share出来呢?哪个步骤解决了,哪个步骤还在探索中,

  • 谢谢您回复了.

    1. 现在全部编译通过了

    2. 之前遇到不能启动的问题,是因为我一直在用一个脚本写boot.img到USB上,而该脚本限制了文件的大小,只拷贝了2*384k, 所以造成了不能启动.把这个解决了,后面才能调参数, 因为现在屏幕一直在闪. 

    3. 目前图片不能显示,肯定是参数不对了.

    我再自己解决一下,如果解决不了,我会把我的LCD屏的规格发上来,请帮忙看一下.

  • 我实验了很多次,图片几乎不能显示,屏幕在滚动,变花. 

    下面是LCD 屏的数据, 附件中有我的 rasterDisplay.c 文件. 

    我对 水平扫描和垂直数据改了很多,都没有什么效果.

    请帮我看一下, 不胜感谢.

  • 我改了一下uboot的菜单, 想更方便的调试, 发现Lcd_Init 这个函数再次调用的时候, 屏幕就变白,没有任何显示了, 即使数据跟第一次调用的时候一模一样.

    使用ULCD off , ULCD on 也是,屏幕变白, 没有任何显示.

    不知道有什么好办法没有.

  • 我发现你配置LCD的时序有问题, 我看到你的rasterDisplay.c的代码是这样的:

    RasterHparamConfig(SOC_LCDC_0_REGS,800,48,40,40);

    RasterVparamConfig(SOC_LCDC_0_REGS,480,3,13,30);

    我把它修改为以下,你试下行不行

    RasterHparamConfig(SOC_LCDC_0_REGS,800,40, 210,46);

    RasterVparamConfig(SOC_LCDC_0_REGS,480,20,22,23);

  • 改了一下uboot的菜单是什么意思呢?

  • 终于可以了, 找到原因了.

    1. 在debug 前面的u-boot 大小的问题的时候,我在RasterDMAFBConfig 函数中 设置 ceiling的时候,除以了10. 后来就忘掉了.结果,一直不对.

     HWREG(baseAddr + LCDC_LCDDMA_FB0_CEILING) = ceiling/10;

    所以一直搞不定,就是因为这个原因了. 谢谢您的回复,促使我把目录全部清空,重新来过,上面那个错误就避免了.

    现在可以通过u-boot loader 显示图片了.

    非常感谢!!

    后面就要解决内核接管之后,图片的显示了.

  • 我做了一个补丁,放在了附件中

    需要的可以拿来用.

    001.add_lcd_driver.patch.tar.gz
  •  great!

    我想再深入了解您的问题,您回复有点跳跃。

    1.你的LCD图片显示不出来,是时序问题吗?还是设置ceiling/10的问题?

    2.当初你基于什么原因把ceiling/10呢?

    3.是否可以把您的补丁的使用方法和功能详细地share给大家?

  • 说来话长. 简单回答一下.

    1.你的LCD图片显示不出来,是时序问题吗?还是设置ceiling/10的问题?

    2.当初你基于什么原因把ceiling/10呢?

    一开始的时候,我一直再用一个脚本,把u-boot写到USB上去, 该脚本限制了大小,所以系统没法启动u-boot. 这导致我认为u-boot需要控制在一定大小之内. 所以我在试着ceilling/10 ,减少u-boot的大小. 后来找到脚本的问题后, 忘记了把这个地方改回去.这就导致了图片没法正常显示的问题. 

    至于时序,我试过很多参数, 得出的结论是,大部分情况下,时序会让图片显示的质量不好,但还没有到图片无法显示的程度.

    3.是否可以把您的补丁的使用方法和功能详细地share给大家?

    git hub: https://github.com/wweiradio/Bootloader-Builder

    git clone 

    ./mybuild.sh  // 这个是为BBB build 的, 

    就可以把你文章中的/drivers/lcd, 以及其它必要的改动, 打补丁上去,然后build. 

    把USB插入,

    ./myburn.sh

    按回车确认, 就可以把MLO和u-boot写到磁盘上.

    希望以上讲清楚了. 

    ----

    我还有两个问题需要请教一下: 

    1) 我发现u-boot的图片只能持续很短的时间. 需要在linux 内核启动的过程中,直到我的应用起来,显示图片.

    在这个帖子中, http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/123097.aspx

    里面提到了 "psplash" 但是我不知道怎么才能让内核调用psplash. 您有相关的资料吗? 

    2) 我在换了Linux 内核(vmlinuz-4.4.39-bone-rt-r15)之后, 默认 情况下, LCD可以显示, 但是, 总是有一条水平线从上到下的一直在滚动. 

    换回内核 vmlinuz-4.4.30-ti-r64 就没有这个问题. 请问您有解决的思路吗? 



  • 问题一:

    kernel的启动是直接支持logo启动的,进入menuconfig后

    修改内核配置选项

      (1)Device Drivers --->

           Graphics support --->
              [*]Boot logo --->
                 [*] Standard 224-color Linux logo
       支持kernel logo

      (2)Device Drivers --->

           Graphics support --->
             Console display driver support --->
                <*> Framebuffer Console support
       不选该项无法在屏幕上显示。

    再打开/SDK/board-support/linux-4.4.19+gitAUTOINC+db0b54cdad-gdb0b54cdad/drivers/video/logo,你可以用你的图片去取代这个文件夹里面的图片,注意命名,然后make zImage就可以了。

  • 问题二:

    有一条水平线从上到下的一直在滚动的情况出现在Uboot的阶段吗?还是在文件系统起来后出现的?

  • 谢谢回复,整个问题已经解决了. 问题是我修改的uboot出现问题. 经TI的朋友指导,已经修复了.

    上面内核的配置,我会试一下,然后回来报告结果.

  • 你好,根据文章中步骤,我实现了开机时在uboot阶段显示logo的功能。

    但是现在LCD的显示存在一个问题,包括以下两种情形:

    情形1:假如uboot logo图片为pic1,本次断电关机时LCD屏幕上显示的最后图片为pic2,那么如果在本次断电后立刻马上(5s内)进行下一次上电操作,此时LCD屏幕上会先显示pic2,然后pic2一闪而过,接下来才显示logo图片pic1;

    情形2:如果在本次断电后暂停一段时间(10s以上)再进行下一次上电操作,此时LCD屏幕则不会显示pic2,而是闪一下之后直接显示logo图片pic1;

    请问这个问题应该从哪一方面着手去解决,谢谢!

  • 感觉像是buffer没清空的问题,数据buffer有可能存在于AM335 lcd控制器,也有可能存在于LCD屏的本身,请问你所说的断电是冷复位还是热复位,还有的是LCD屏有没有复位呢?

  • 你好,我用的AM437x,现在想在uboot里面加入boot logo,请问该如何支持呢?

    我看了下335x的LCD控制器好像和437x的差别很多啊,感觉不能直接移植335x的rasterDisplay啊!

  • 对的,两个控制器是完全不一样

    目前还没有在uboot里面实现LCD,以后的PDK会增加

  • 那没有办法像335x那样移植一个适合437x的显示吗?

    以后的PSDK,大概什么时候会增加呢?

    我现在有个需求,根据不同的厂商加载不同的开机画面,我是想把开机画面存在文件系统里,uboot阶段选择开机画面直接显示(kernel阶段文件系统加载之前是无法访问文件的),不知道有没有好的办法?

    谢谢!


  • board/ti/am335x/libam335x.o: In function `lcdbacklight_off':
    /home/qudongdong/hanru/tiam335x/board-support/u-boot-2013.01.01-psp06.00.00.00/board/ti/am335x/board.c:564: undefined reference to `Lcd_off'
    board/ti/am335x/libam335x.o: In function `lcdbacklight_on':
    /home/qudongdong/hanru/tiam335x/board-support/u-boot-2013.01.01-psp06.00.00.00/board/ti/am335x/board.c:572: undefined reference to `Lcd_on'
    board/ti/am335x/libam335x.o: In function `board_lcd_reset':
    /home/qudongdong/hanru/tiam335x/board-support/u-boot-2013.01.01-psp06.00.00.00/board/ti/am335x/board.c:580: undefined reference to `Lcd_reset'
    /home/qudongdong/ti-sdk-am335x-evm-06.00.00.00/linux-devkit/sysroots/i686-arago-linux/usr/bin/arm-linux-gnueabihf-ld.bfd: BFD (crosstool-NG linaro-1.13.1-4.7-2013.03-20130313 - Linaro GCC 2013.03) 2.23.1 assertion fail /cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/src/binutils-2.23.1/bfd/elf32-arm.c:7677

    按照pdf文件操作 没有总是报错  求解决办法

  • 我下载的文件里面怎么没有rasterDisplay.h 文件 没有这个.h文件

  • 你好,我试了你的代码,在uboot2014.10上 ,显示成功了,十分感谢!但我的液晶是16位模式,其他的8个IO,被我当键盘了。

    看了下,LCD驱动代码应该是24位的,为了防止在LCD 24位模式工作下,按键不小心烧了LCD IO,我准备把驱动改成16位的。

    我先修改了。LCDPinMuxSetup( )函数,去掉了那8个不用的 引脚。

    然后看代码注释:

    if(displayMode == RASTER_DISPLAY_MODE_TFT)
    {
    if(flag == RASTER_RIGHT_ALIGNED)
    {
    /* Output pixel data for 1,2,4 and 8 bpp is converted to 565 format */
    HWREG(baseAddr + LCDC_RASTER_CTRL) &= ~(LCDC_RASTER_CTRL_TFT_ALT_MAP);
    }

    原函数

    RasterModeConfig(SOC_LCDC_0_REGS, RASTER_DISPLAY_MODE_TFT_UNPACKED,RASTER_PALETTE_DATA, RASTER_COLOR,RASTER_RIGHT_ALIGNED);  

    修改为:

    RasterModeConfig(SOC_LCDC_0_REGS, RASTER_DISPLAY_MODE_TFT,RASTER_PALETTE_DATA, RASTER_COLOR, RASTER_RIGHT_ALIGNED);

    然后液晶就不显示了。不知道哪里还要修改,image.h也要修改吗,换成16位?

    谢谢了!

  • uboot-2015.07测试效果还不错,不过还是有点问题:

    1.显示的图片文档里面的不太一样,红色部分变成了蓝色,开始以为是颜色翻转,但是觉得如果是这样的话,应该背景颜色是黑色,英文字母是白色才对呀。

    所以我在网上找来一张颜色比较丰富的图片来测试一下,结果显示出来的图片颜色没有问题。

    下面是网上图片http://image.so.com/v?q=800x480&cmsid=3babec67c6b0704fa3cc10ba95156a46&cmran=0&cmras=0&i=2&cmg=a8e6a6804ab2b1a9af00cd15eb98df1e&src=360pic_strong&z=1#q=800x480&i=2&src=360pic_strong&z=1&lightboxindex=48&id=8ca7f5b287ff597db52051b251cf5064&multiple=0&itemindex=0&dataindex=48&prevsn=0&currsn=0&jdx=48

    颜色是没问题的,只是拍照的效果不太好。

    测试到这里是不是说明LCD显示部分是没问题了呢??

    2. 用添加的ULCD命令来控制LCD的时候,“ULCD off” --> "ULCD on" 或者“ULCD reset”--> "ULCD on"之后,屏幕显示 图片不正常,很凌乱。我查看了源码Lcd_on和Lcd_off的实现,是通过开启和关闭raster来实现,觉得之所以显示图片不正常,可能是frambuffer l里面的数据已经大部分丢失(这个跟第3点有矛盾),需要重新向frambuffer写入数据,所以我把Lcd_on里面的RasterEnable函数替换成Lcd_Init函数(看到里面是对LCD进行引脚和寄存器初始化之后再绘图,也就是配置LCD绘图)。但问题依然存在。。

    3. 从uboot启动到内核,启动到start kernel... (或是再提前一点时间), 由于在启动参数里添加了“run LCD_RESET”(执行了”ULCD reset“),屏幕就变暗了。然后内核重新初始化LCD相关配置之后,屏幕的背光先是闪一下再显示kernel的logo。但是再背光闪的那一下,是能够看到正常的uboot的图片(这点说明就算是”ULCD reset“, frambuffer里面的数据没有丢失)。

    以上第2 和第3点有不明白,能否解答一下

  • 您好,我下载了您的ZIP包,并且将uboot的LCD完全替换,也按照文档里的步骤增加了宏定义等,然后编译也很顺利的通过了,,,但是烧进板子后,卡在了Jumping to U-Boot这个里了,请问可能是什么原因,,,环境是am335x-sdk-v1.0/u-boot-2014.07$

  • 你好,请问你的uboot 显示logo保持到kernel功能实现了吗,谢谢分享
  • 您好:
    我用这个方法成功移植到了am335x starter Kit开发板上,480x272 pix_clk 12M ,我们公司自己的板子,显示屏是1024x768,结果出现了两种情况,第1种情况,用RasterClkConfig(SOC_LCDC_0_REGS, 65000000, 100000000);函数,板子实际没有输出0.7M,如果设置30M可以正常输出30M;第二种情况u-boot编译后大小为3.5M,u-boot卡在reading u-boot.img,请问为什么会出现这两种情况,谢谢