导入:用Widora-NEO制作迷你相册 (midas-zhou)


  • administrators

    用Widora-NEO制作迷你相册已初步完成,目前可以逐一读取SD卡上的BMP格式24bits Color文件进行显示,图片最大480x320像素,自动居中显示。 具体效果可以看 http://player.youku.com/player.php/sid/XMTc2NTk0MTIwMA==/v.swf
    你也可以一边看,一边连着BIGIOT,一边用widora听广播,这种情况下总的CUP占用率20-30%左右。
    程序中用了很多从网络中下载的代码,主要有"佐须之男“的GPIO控制程序 和“lzy”的 Linux下SPI测试程序 。 程序直接在op上用gcc编绎而成,小程序几秒钟的工功。

    刚开始用gcc编程,本人也非专业出身,因此程序里肯定有不少可笑之处。尽管如此,本着“开放共享”的自由软件精神,还是将代码先帖出来,供大家参考。 高手看完代码可能都不需要再往下看了。

    更新
    0_1477499485533_173163243b17746251fdd171c7243ae8731387fb_1_690x323.JPG

    1.LCD屏与WIdora-NEO连接方式
    LCD屏与Widora用SPI方式连接,MISO空置不用,GPIO14脚用作数据/命令选择位。按照如下图连接:
    0_1477499501301_158b07e2981298b480276d52963e70972d3e4128.png

    2.LCD控制器RM68140说明
    LCD采用了Raydium RM68140控制IC,262,144-color, 320RGBx480 dots graphics liquid crstal controller driver for Amorphous-Silicon TFT Panel .支持 18/16/9/8-bit 和 SPI 数据传送。
    RM68140主要设置如下几个寄存器(其他参考厂家例程和DATASHEET):
    ----- 36H Memory Data Access Control
    主要是设置图片显示方式,比如图片颠倒,左右置换等。还有指定RGB顺序,由于BMP文件是以BGR顺序存放图像数据的,因此也应该设置成BGR顺序。当然,如果你设置成RGB的话,传送的时候按照这个顺序来也是可以的。
    ----- 3AH Interface Pixel Format
    这个用来设置色彩位,我选择18bit色,即RGB各占6个bit. 24bit色BMP图像BGR各8位直接送LCD就可以了,后2位不用处理。
    <img src="/uploads/default/original/1X/158b07e2981298b480276d52963e70972d3e4128.png" width="552" height="219">

    3.程序说明
    RMshow18bit3.c是主程序,循环执行:要求输入图片路径,显示图片,要求输入图片路径,显示图片,..........。主要是为了以后方便python脚本来调用。

    4.---------问题----------
    4.1 目前SPI_Write()一次传送最多32bytes数据,大于32字节SPI不工作。

    更新0_1477499530229_ShowBMP-10-23.tar

    大神请飘过........学习linux C! 修改了一下代码:

    1. 循环显示指定目录下的BMP图片, 每张图片停留10秒. (图片格式:小于480x320 24BIT 色, 注意:在电脑上用画图板看的话,应该长边是高度,短边是宽度)
      命令例子: ShowBMP /usb/pic/ ( 编译 gcc -o ShowBMP RMshow18bit6.c )
    2. 计算并printf每次SPI发图片数据所用的时间。 目前每幅图片 ~500ms.
    3. MMAP, 似乎效果不大。 ?

    RMshow18bit.c中 #include "./picture.h" 没用,请注释掉。 经实验,程序在ubuntu中交叉编译后同样OK.



  • 使用中注意:

    1. 电源额定电流应大于1A。
    2. 如果不在SPI CK线中串个合适大小的电阻,widora重启很可能失败。


  • 此回复已被删除!


  • 写了个python脚本,可以将一个目录下的所有jpg图片转成适合480x320LCD的24bit BMP文件。这样可以直接将网上下的图片放在目录里,执行一下python脚本就全部转换完成了。然后就可以调用LCD刷图程序了。 脚本在这里:0_1477723101690_RMjpg2bmp.py



  • 在widora-neo上安装python Image Library:
    opkg install python-imglib



  • 试验了一下用多线程和多进程来向SPI写入数据,写屏的速度并没有提高. 看来还得从SPI驱动上来提高速度。
    多线程: 0_1478569520370_RMshow18bit7.c
    fork多进程: 0_1478569539162_RMshow18bit9.c



  • 参考了网上的这篇文章http://blog.csdn.net/longshengguoji/article/details/9946675

    然后改下来爬青年网的图片,居然可以~~~~

      #!/usr/bin/env python
      #coding=utf-8
     import urllib
     import re
    
     def getHtml(url):
         page = urllib.urlopen(url)
         html = page.read()
         return html
    
     def getImg(html):
         reg = r"src='(.+?\.jpg)'"
         imgre = re.compile(reg)
         print "search for picture links..."
         imglist = re.findall(imgre,html)
         x = 0
         print "start retrieving picture..."
         try:
          for imgurl in imglist:
             print imgurl
             try:
               urllib.urlretrieve(imgurl,'%s.jpg' %x)
             except:pass
             print 'save to ',x,'.jpg'
             x+=1
         except: pass
    
     html = getHtml("http://picture.youth.cn/")
     getImg(html)


  • 试验了一下从内核模块写数据,480x320x16位色 基本上0.1s 每帧。
    代码见: https://github.com/widora/ctest/tree/master/kmods/kspi_draw

    有个问题,SPI硬件设置里的 hclk 是多少呢?475MHz ?



  • 如果spi的速度设置成35Mb,那么480x320x24bits一幅画数据传送理论上只要 480x320x24/35/1000000=~0.1s 吧 但实际要0.2s 一直困惑....死结谁帮解一下?/呲牙 我用了preempt,关闭所有中断等措施 还是0.2s,Spi发送数据位设最大,接收数据位设0,结果依旧.... 还是没理解系统工作机理/呲牙



  • 改用指针来传递数据,提高到0.15s 每帧了( 480x320x24bits)。
    显然,如果LCD控制器是和widora-neo集成的而不是目前的排线连接,再改善下PCB布线设计等,再将SPI的时钟频率设置提高, 这样还可以加快刷新率。



  • 谢谢楼主的工作,我也对这个路由板写屏幕感兴趣,向您学习!
    不过现在论坛里的附件都下载不了,不知道是怎么回事,谢谢啊!
    我初步的想法是给这种spi屏添加lcd4linux的驱动,让lcd4linux来显示路由器状态,不知可否得到楼主的支持,谢谢啦!



  • @awayfar 所有代码等都在 github.com/widora/ctest 下面。 你说的这个模块芒果好像已经实现了吧。

    另外: 我觉得如果有LCD的控制芯片能支持黑白模式的就棒了!这样理论上每个像数只要1bit的数据,1bit/pixel的模式下用SPI连接LCD的刷新速度就不是问题了,正好满足仅输出黑白文字(比如: 系统交互终端)之类的显示要求。



  • @midas-zhou 非常感谢,我先去读一下,向您学习了!买了几个不同的SPI接口的屏来试试看。感觉1bit/pixel这种方式,大部分的厂家不一定用吧,好点的屏买点也在彩色上啊。当然e-ink厂家愿意这么做就好了。我先试试,到时候向您请教哈!:)



  • @awayfar 黑和白对应的RGB应该全0或全1吧,黑白模式的时候可以用硬件将1bit/pixel扩展到24bit/pixel,用LCD并口。