图1. LCD子系统结构
Framebuffer:是linux的framebuffer驱动在内存开辟的一块显存,存放一帧图像数据。
IPU:是mx51的图像处理单元,里面包含DMA控制器和DI显示接口等。
LCD Driver :是一块和LCD屏幕整合在一起的驱动芯片,接收IPU传过来的数据和时序信号,转化为有规律的LCD驱动电压。
一幅图像的显示过程是这样的:用户打开/dev/fbx设备,使用mmap()系统调用映射framebuffer内存空间到用户空间,用户直接用 memcpy()复制图像数据到framebuffer,DMA探测到framebuffer数据发生变动,启动DMA传输图像数据到IPUI,PU再根 据framebuffer驱动设置的处理模式对像素数据进行一系列处理,比如framebuffer使用了overlay framebuffer那就启动overlay处理单元混合两个framebuffer的数据,另外IPU还会packing像素数据,比如 framebuffer里像素格式为RGB565,IPU会把他packing成RGB666的格式,以配合LCD模块的接口。IPU处理完数据后,送到 DI,在DI时序模块产生的时序信号同步下,一起输出到LCD驱动芯片。
移植LCD驱动的第一步,是确保IPU输出给LCD Driver的时序、数据、供电信号是对的。
时序信号一般是根据LCD的datasheet上的参数,填写fb_videomode这个结构体:
struct fb_videomode {
const char *name; /* optional */
u32 refresh; /* optional */
u32 xres; // x分辨率
u32 yres; // y分辨率
u32 pixclock; // 像素时钟频率,即每个时钟周期显示一个像素点
u32 left_margin; // 行扫描开始脉冲到一行像素数据开始输出的延迟 hsync<==>DEN
u32 right_margin; // 一行像素数据输出完毕到下一行的行扫描开始脉冲间的延迟 DEN <==>hsync
u32 upper_margin; // 帧扫描开始脉冲到第一行像素数据开始输出的延迟 vsync<==>DEN(1st line)
u32 lower_margin; // 最后一行像素数据输出结束到下一帧的那帧扫描开始脉冲间的延迟DEN(last line)<==>vsync
u32 hsync_len; // 行扫描脉冲宽度,单位为pixclock
u32 vsync_len; // 帧扫描脉冲宽度,单位为line
u32 sync; // 各同步信号的极性定义,如hsync、vsync、DEN的极性等。
u32 vmode; // 显示模式,逐行还是隔行扫描
u32 flag; // 一般为0
};
这个结构体定义完之后,对于一般的LCD,在连线正确的情况下,系统启动后应该就出来图像了,此时图像可能是上下跳动或者左右有偏移,这就需要再调整一下 fb_videomode中left/right/upper/lower margin参数。如果上电后没有图像,则首先用示波器检测hsync, vsync,DEN,pclk等波形是否正确,使用双踪示波器通过hsync、vsync与DEN的比对查看left/right/upper /lower margin是否合适。如果这些信号都没有问题,那么说明LCD需要通过spi总线发送命令对其进行初始化。初始化代码一般由LCD厂商提供,不过很多厂 商提供的初始化代码都有问题,会导致LCD白屏或者其他不正常的现象。
TFT LCD的原理:
图2. TFT LCD截面图
TFT LCD主要由两个透明电极,中间的液晶分子和一个有色玻璃组成。在没有通电的情况下,液晶分子呈无规则排列,背光无法透过液晶层。当有外加电场时,液晶分 子顺着电场的方向有序排列,背光可以通过,并且由于有色玻璃的滤光,呈现红,绿,蓝色调,不过,背光的透过率只有10%,这是LCD的一个缺点。
以上是一个像素中的一个RGB分量的产生过程。接下来看看如何整合这个基本单元,组成一个LCD屏幕。
图3. LCD平面图
这个图比上面多出来的是2种长条和一种MOS晶体管。这3个东西的作用是在一定的时序下给各显示电极充电。横向的长条和LCD驱动芯片的Gate Driver连接的,用于打开各行的MOSFET。纵向的长条和LCD驱动芯片的Source Driver连接,代表RGB数据。整个过程大致是这样的:首先第一行的Gate线产生一个充电脉冲,使第一行的MOS管导通,同时Source线那边经 过数模转换后的RGB电压也已经就绪,于是通过MOS管对显示电极充电,每个pixel clock充电一个像素,即3根Source线完成充电。对于320x480的屏,一共有480根Gate线,320x3=960根Source线,则经 过320个pclk后,第一行充电完成,显示出相应的画面。然后,第二行的Gate线产生一个充电脉冲,一次类推,直到最后一行,又从第一行开 始.....
图4. LCD基本结构
图4. LCD传输分解
图5. LCD基本单元图
图6. LCD阵列图
图7. LCD信号图
图8. LCD整体框图
LCD点屏步骤:
1.参考LCD datasheet修改fb_videomode结构体的参数。
2.配置GPIO,点亮LCD背光。
3.参考LCD datasheet看这个LCD是否需要spi总线发送命令进行初始化,一般厂商给datasheet时也会给一份初始化代码,不过有些参数是错误的,需要调整,发送不正确的命令会导致LCD白屏。
4.用示波器测试从LCD控制器出来的Hsync, Vsync, DE, PCLK是否正确,用万用表测量Vio, Vci是否正常。
5.有的LCD Driver需要LCD控制器发出一个CS片选使能信号。
6.用万用表测量LCD的栅压是否正常,一般为9.2V。
7.如果上述步骤后还出不来,再检查LCD初始化命令是否正确,spi时序是否符合。
图像异常处理:
1.驱动问题
上下抖动,左右没对齐:调整left/right/upper/lower margin值
2.LCD初始化命令问题
有纹波:调整VDD/AVDD/VGL/VGH电压
色彩失真:看LCD的RGB模式设置和LCD控制器出来的RGB模式是否一致
Vision Mobile 网站最新公布了《移动开发者经济学2010及未来》的报告,其中提出了许多移动开发领域新的见解,包括移动开发者关注力的变化,幕后推手及对开发者所参与各阶段的分析——从选择平台到出售兑现。
该报告基于一组测试基准以及对全球八大平台、400 多位开发者所做的调查。平台划分为:iOS(iPhone)、Android、Symbian、BlackBerry、Java ME、Windows Phone、Flash Lite 以及移动网络开发(WAP/XHTML/CSS/Javascript)。
从开发者关注力的角度来看,我们的研究表明 Symbian 和 Java ME 曾经占据过主导,直到 2008 年才被 Android 和 iPhone 超过。尽管 Symbian 在智能手机市场的渗透率仍占据第一位,四倍于 iPhone,相比 Android 更大。但开发者对 Symbian 平台进化的不满早已非常明显。
而实际上从开发者体验的角度来看,Android 是最受欢迎的平台,有近 60% 的受访开发者最近从事过 Android 相关开发,假设这八个平台的有经验开发者比例相当。iOS 是第二受欢迎的平台,超过了 2008 年仍处于首位的 Symbian 和 Java ME。
过去的两年里,Symbian、Java ME 和 Windows Phone 上的移动开发者已经流向 iPhone 和 Android,另有不少 PC 软件开发者也转向这两个平台。受访的 Symbian 开发者中有 20-25% 同时也在 iPhone 和 Android 软件商店里卖程序,这说明目前很多老平台的开发者在心理上也在向新平台转移。大多数 Java ME 开发者对“写一个程序,哪儿都能运行”的景愿也失去了信心。流传的开发者推荐信暗示近半数的明星级 Windows Phone开发者在用 iPhone,并且对再次投入 Windows Phone 开发持谨慎态度。还需要指出一点,一些很有影响力的 Symbian 开发者也在离去,例如作为 Symbian 社区主力网站之一的 Symbian-Guru.com 已关闭,创办人也转向了 Android。
设备保有量与应用程序数量的不一致性
新老平台进化速度差异方面最强有力的证据是设备保有量和应用程序数量的巨大不一致性。Windows Phone、Symbian、Java 和 Flash 的市场渗透率都是 Android、 iPhone 和黑莓的很多倍。但程序商店应用程序数量上的对比却大不相同。
Java ME 和 iOS 是最具代表性的例子。据说有 30 亿部手机装有 Java ME,相较之下,应用程序数量却非常少。iOS 目前有 6000 万部设备(不包括 iPod Touch 和 iPad),但应用程序已超过 25 万,在可预见的未来,数字还将继续增长。
不一致性同样也在跨平台的运行环境如 Java ME 和 Flash Lite 上体现出来。和传统认识完全相悖,跨平台的运行环境被认为是前进的方向,但平台上可用的程序数量却相对很小。最近的苹果和 Adobe 之争以及带来的结果——苹果所有产品都不再支持Flash,削弱了 Adobe 的地位。Sun 在 Java ME 最大的问题,平台分裂方面也只做了些漫不经心地努力,Oracle 的接手只会让问题更严重。
选择移动平台——事实与猜测
400 多位受访者中的 60% 开发经验超过三年,样本反映大多数开发者都为多个平台进行开发,平均每人参与 2.8 个平台。五分之一的 iPhone、Android 平台受访者同时在这两个平台的软件商店发布程序。
问题是:在今天这个软件平台多样化的市场里,开发者如何在 iOS、Android、Symbian、Java ME、黑莓、Flash、Windows Phone、移动网络、WebOS、三星 Bada 中做出选择?对今天的移动开发者来说,市场渗透率和营收潜力无疑是最重要的两个因素。
调查的八个主要平台中,75% 的受访者选择了“高市场渗透率这”。“收益潜力”是第二重要的因素,过半受访者的选择。实际上市场渗透率和收益潜力在选择平台时比任何技术因素都更重要,说明移动开发者现在非常看重移动开发的经济利益。
市场原因超过技术原因也标志着开发人员心理占有率的转变。开发者不再把寻求编程的乐趣视为足够的回报,而是最优先考虑带来收益的机会。移动开发者目前似乎顺应了商业实用主义。正如一位受访者的评论:“技术考量无关紧要,平台选择总是市场导向”。
个人博客正式上线,欢迎访问
文件移动
一. 在应用中由于种种原因需要将一些外部文件放在 assets 或者 raw 文件夹内,以便进一步使用。这两个文件夹有以下的区别和联系:
以下是分割数据的代码:
public static void CutFilesInSizeParts(InputStream fis, String OutputFileName, int MaxPartSize) { try { int TotalLength = fis.available(); byte[] buffer = new byte[TotalLength + 1]; int len = fis.read(buffer); int nbPart = len / MaxPartSize + 1; int CurPos = 0; for (int i = 0; i < nbPart; i++) { int PartLen = MaxPartSize; if (CurPos + PartLen >= len) PartLen = len - CurPos; String outRealFileName = OutputFileName + (i + 1); FileOutputStream fos = new FileOutputStream(outRealFileName); fos.write(buffer, CurPos, PartLen); CurPos += PartLen; } } catch (IOException e) { e.printStackTrace(); } }
二,正是以上两个文件夹只能产生 InputStream 数据流,当程序有别的需要时会显的无能为力。例如在外面创建了一个 sqlite 的 db 文件,该文件需要内置到 apk 中只能放入这两个文件夹中,可是在使用时可要根据需要放置到 sdcard 中或者 database 中去。因此需要对读取文件并在相应位置生成目的文件,按照自己需要的方式进行读取,这也提供了第二种方法。这一步需要注意一下几点:
这里附上合并数据并拷贝的代码
//合并并拷贝数据 public static void CreateFromRawDbFiles(File[] filelist, FileOutputStream Fos) { try { for (File file : filelist) { InputStream inputFile = new FileInputStream(file); int TotalLength = 0; try { TotalLength = inputFile.available(); } catch (IOException e) { } // Reading and writing the file Method 1 : byte[] buffer = new byte[TotalLength]; int len = 0; try { len = inputFile.read(buffer); } catch (IOException e) { } Fos.write(buffer,0,len); inputFile.close(); } Fos.close(); } catch (IOException e) { } }