• Android触控之驱动层与应用层

    本文出自:【InTheWorld的博客】

    触控技术算是现代智能硬件的一大特征。作为一种输入方式,触摸系统与其他输入设备(如键盘)其实非常相似。写这篇blog的初衷并不是要实现触屏驱动移植。而是看《Android内核剖析》等书的时候,发现他们都没有仔细分析触摸系统的整个流程。在这篇博客中,我打算把Android触控技术从硬件驱动到应用层大致分析一下。

    本文以GT810触屏为例进行分析,虽然我手头并没有这个板子。分析原理当然还是要从硬件分析起来了,首先简单地看下电路图吧!

    image

    就是这么简单,重点就在I2C接口和中断CAP_INT。其中I2C总线的作用是数据传输,可以实现触摸屏的初始化以及触摸数据的传输。CAP_INT连接到CPU的中断PIN脚上,用于通知CPU来读取触摸数据。有人画了一张不错的流程图,我贴在下面:

    gt810

    驱动代码的一大特征就是格式统一,毕竟是架构是内核规定好的。所以,在熟悉了套路之后,我分析驱动代码的… 【查看更多】

  • Linux下矩阵键盘驱动分析与移植

    本文出自:【InTheWorld的博客】

    首先要介绍一下Linux中input子系统的模型,一图胜千言,所以直接上图。

    input_subsys

    上图一目了然,我们的键盘驱动就是工作在input子系统的最低层。单纯地从驱动角度讲,我们的工作就是最终调用input_event()这个函数,把扫描到的键值传递给input core层。然后的事情就不是我们考虑的了,这样一来感觉很轻松的样子。

    好吧!正式开工了!首先说明一下硬件环境,我用的是友善之臂的tiny210开发板。出厂配置的内核是没有加入矩阵键盘的。不过驱动代码是有的,所以在menuconfig里面配置矩阵键盘。说实话,这工作真的很弱智的样子。为什么呢?因为210处理器上是有一个键盘控制器一样的东西。什么扫描,消抖都是硬件在干。唯一需要改动的地方就是键盘的键值表。默认的驱动里面只用44的键值数据,但是我要用的键盘要88才行。

    然后我们分析一下驱动的结构,键盘在210上是作为一个平台设备存在的。那么… 【查看更多】

  • NDK开发的入门级总结

    本文出自:【InTheWorld的博客】

    就在两天前,我对JNI或者NDK开发的了解基本都还处于Hello World水平。这两天花时间学习了一下,算是对NDK开发有了一些入门级的了解。所以我准备写这一篇博客,算是一个入门级的学习总结。鉴于目前的水平,这篇blog不会讨论到一些复杂的内容,仅仅是一些流程的理解和分析。


    • JNI和NDK的开发思路

    NDK听起来好像很神秘,但实质上就是Java调用C/C++代码的技术。考虑到JVM就是用C/C++写的,Java调用C/C++其实并没有本质上的难度。以前写过一篇关于Lua调用C扩展的博客,其实就和JNI的思路是差不多的,当然Java比Lua复杂的多。JNI本质上就是这种调用的支持接口,在展开这种支持接口的使用方法之前,先来探讨一下这种接口的实现思路。

    虽然JNI已经明确的定义了接口函数的设计标准,但具体的实现还是有很多门道的【查看更多】

  • 基本线程同步总结(C与Java)

    本文出自:【InTheWorld的博客】

       《Posix多线程程序设计》是我读的第一本关于多线程程序设计的书籍。这本书生动且深刻地讲解了多线程程序设计的难点与Pthread库的使用方式,我从中收获颇丰。Pthread作为操作系统接口标准,直接用于应用层开发难免会让人感觉到有些单薄。Java对多线程程序设计模式进行了一定的封装,以方便大家的使用。然而在基础功能上,Java的多线程程序与Pthread其实非常相似,这也是这篇blog是使用这个标题的原因。

    • Mutex(Pthread) vs Lock/synchronized(Java)

        Mutex是Pthread提供的最基本的线程同步工具,Mutex的功能突出一个简单粗暴,类似于操作系统中的自旋锁(当然,Mutex会【查看更多】

  • 表达式之运算顺序与求值顺序

    • C/C++中的情况

    写这篇水文的缘由是技术群里的一个同学提出的问题,可能是什么笔试题目吧!内容很简单,求表达式(++a) + (++a) + (a++)的值,其中a=5。对于这个问题,估计大部分同学都会给出20这个答案,我也是这么想的。在Java中,这个表达式的答案也确实是20。可惜这个题目的背景是C/C++,问题好像不是那么简单了,VC6给出的答案是22。开始我没有仔细算,猜测是C/C++在处理算术表达式的时候使用了某种自顶向下的文法。为了消除左递归,表达式求值的时候是按照从右到左的顺序处理的。但是,这样也不能解释VC6给出的答案,这种求值顺序的答案应该是21才对。

    理论分析吃瘪,我决定还是看看汇编吧!我先在GCC下做了个简单的实验,结果是21。反汇编的结果如下:

    image

    乍一看结果21,可能有人会认为这个结果的计算过程是6 + 7 + 8。到底是什么样,看汇编便知… 【查看更多】

  • Qt on Windows实现解析

    就窗口系统而言,我对C/S架构的更为熟悉一些。以前看过基于X window的一些实现,比如qtopia以及其他一些嵌入式窗口系统。C/S架构的GUI系统的结构比较清晰。其中,窗口服务器负责监听输入时间、屏幕绘制以及窗口状态维护,应用程序负责接收服务器的消息并进行处理、并把状态改变反馈给窗口服务器等。

    但是,Windows窗口系统使用的却是基于共享库的实现方式。共享库中保存着所用图形客户端的窗口信息,共享库和每一个客户端程序都运行在同一个进程中。基于共享库的图形系统具有响应速度快、资源开销小的优点,这也是Windows窗口系统表现非常优秀的原因。这种窗口系统带来的问题就是对共享信息访问的安全性。

    在虚拟内存管理的前提下,对这些共享信息的访问无疑要借助内核态的帮助。Windows下的图形应用之所以需要提供回调函数,是因为这个… 【查看更多】

  • 多线程程序之线程私有数据

    在C/C++的多线程程序中,所有的线程共享相同的地址空间。所以数据段和进程堆的数据,都可以被所有线程读写。在极端情况下,线程的栈空间也可以被共享。只有线程的寄存器上下文算是真正私有的。对于某些变量,我们希望它在不同的线程中具有不同的值,这就是线程私有数据的用途。

    对于普通的全局变量,或者通过指针或引用实现的共享,其实在内存中只存在一个备份。而进程私有数据则相当于一种Map型的变量,根据线程的id,线程私有变量对应于不同的值。

    /*
     * tsd_once.c
     *
     * Demonstrate use of pthread_once to initialize something
     * exactly once within a multithreaded program.
     *
     * Note that it is often easier to use a statically initialized
     * mutex to accomplish
    【查看更多】
  • C++智能指针

    今天复习了一下智能指针,然后动了动脑子,恍然觉得以前并没有真正的理解智能指针。首先是shared_ptr,shared_ptr的作用就不做介绍了。那么shared_ptr是如何实现的呢?我分析了一下,智能指针的要点就是“计数”和“指针”。所以智能指针的成员变量中就必须有计数值和对象指针。

    指针计数为零的时候自动销毁,所以析构函数中需要实现计数和对象销毁的功能。然后还要注意的就是复制构造函数和复制函数(operator=)。想起来觉得也不难实现,于是就动手写了个丑陋版shared_ptr。

    #include <iostream>
    
    namespace toy{
    template<class T>
    class shared_pointer{
    
    public:
        template<class Y> explicit shared_pointer(Y* p) {
            px = p;
    【查看更多】
  • C++RTTI小总结

            RTTI算是C++的一大特性之一了,但也是一个不太好懂的特性。以前一直没有理解清楚RTTI。通过最近的学习,似乎掌握了一点皮毛,这里做一个小总结。首先是《C++编程思想》上的一个例子,由于缺头文件,我把容器改成了vector。

    #include <iostream>  
    #include <time.h>  
    #include <typeinfo.h>  
    #include <vector>  
    #include <stdlib.h>  //for srand() and rand()  
    using namespace std;  
      
    class shape {  
    protected:  
        static int count;  
    public:  
        shape() { count++; }  
        virtual ~shape()
    【查看更多】
  • C++静态成员变量

    今天在弄一段代码的时候遇到了静态成员变量的问题。卡了一段时间后,果断翻出《深入探索C++对象模型》,大概明白了问题所在。这事给我的一点启示就是“纸上得来终觉浅,绝知此事要躬行”。首先看看问题吧!其实就是一个类型的定义。代码如下:

    //myApplication.cpp  
    #include "myapplication.h"  
    #include <iostream>  
    using std::cout;  
    using std::endl;  
      
    myApplication::myApplication(string _appName):appName(_appName)  
    {  
        if(self!=0)  
            return;  
        else  
            self=this;  
    }  
    void myApplication::printAppname()  
    {  
        cout<<appName<<endl;  
    }  
    myApplication*
    【查看更多】