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

用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位不用处理。

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.

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

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

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

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

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

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

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

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

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

参考了网上的这篇文章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)

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

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

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

使用中注意:

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