Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4462959
  • 博文数量: 356
  • 博客积分: 10458
  • 博客等级: 上将
  • 技术积分: 4734
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-24 14:59
文章分类

全部博文(356)

文章存档

2020年(17)

2019年(9)

2018年(26)

2017年(5)

2016年(11)

2015年(20)

2014年(2)

2013年(17)

2012年(15)

2011年(4)

2010年(7)

2009年(14)

2008年(209)

分类: Android平台

2013-04-26 14:27:37

板子helper2416    芯片是三星的s3c2416  arm平台   本机系统: opensuse

所谓热身就是利用现成的资源尝试在helper2416板子上跑android, 现有的内核,现有的android的根文件系统

kernel,下载地址:

根文件系统,用网上流传的armv4,下载地址:
根文件系统源码 de.google.com/p/android/downloads/list?can=1&q=   android-emulator-1.0_r2.tar.bz2
选中Android内核必须选项
              Kernel Features ---> [*] Use the ARM EABI to compile the kernel
              General setup ---> [*] Use full shmem filesystem
              General setup ---> [*] Enable Android's Shared Memory Subsystem
              System Type ---> [*] Support Thumb user binaries
              Device Drivers ---> Android ---> [*] Android log driver
              Device Drivers ---> Android ---> <*> Binder IPC Driver
      尽量选中Android内核可选选项
              Device Drivers ---> Android ---> [*] RAM buffer console
              Device Drivers ---> Android ---> [*] Android timed gpio driver
              Device Drivers ---> Android ---> [*] Only allow certain groups to create sockets
tar -xvf armv4.tar.gz得到armv4文件夹
cd armv4,你将看到三个文件夹,分别是data,root,system,其它三个是.img文件,可以忽略不要,分别把data,system文件夹copy进root文件夹中,覆盖root里原先的data,system文件夹,挎贝armv4/root/中的所有文件到nfs目录下


修改/init.rc文件,去除除mount tmpfs tmpfs /sqlite_stmt_journals size=4m之外的所有mount命令
使用上面的与根,再把kernel移植到helper2416,可正常启动显示画面


按键可正常工作,并唤醒系统,但是触摸屏android无响应
参考解决方法:
修改触摸屏驱动(在内核中改)
按下时:input_report_key(input, BTN_TOUCH,1);
释放时:input_report_key(input, BTN_TOUCH,0);
另外如下修改
#if 0  // JYX_MODI for android touchscreen
    ts->dev->evbit[0] = ts->dev->evbit[0] = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS);
    ts->dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
#else
    ts->dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
    ts->dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
#endif


移植用的开发板没有电池的驱动,因此  android无法获得正确的电池状态,默认为LCD off的状态,android在LCD off状态下,
输入的任何touch的点都当作(0,0)处理,因此需要修改相关的代码。
修改的方法:
文件frameworks/base/services/jni/com_android_server_BatteryService.cpp
函数android_server_BatteryService_update
在最后加入:
env->SetBooleanField(obj, gFieldIds.mAcOnline, true);
env->SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusUnknown);
env->SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthUnknown);


android2.0里面还是不能正常工作,这是因为android把单点的touchscreen当成多点的来处理来。
权宜的解决方法,过滤掉多点的设备类型:
文件
frameworks/base/services/java/com/android/server/KeyInputQueue.java
在mThread线程代码中修改,classes值如下:
final int classes = di.classes &(~(RawInputEvent.CLASS_TOUCHSCREEN_MT));


另外一种针对电池状态的改法
修改:frameworks/base/services/jni/com_android_server_BatteryService.cpp,补丁如下。
在init.rc文件中添加
setprop battery.fake_ac 1


    #include
    #include


    +#include
    +
    +
    #if HAVE_ANDROID_OS
    #include
    #endif
    @@ -173,6 +176,29 @@


    static void android_server_BatteryService_update(JNIEnv* env, jobject obj)
    {
    + static int enable_fake_ac = -1;
    + if( enable_fake_ac == -1 ){
    +        char value[PROPERTY_VALUE_MAX];
    +        enable_fake_ac = 0;
    +        if ( property_get("battery.fake_ac", value, 0) ){
    +          if( 0 == strcmp( value, "true") || 0 == strcmp(value, "1") ){
    +             enable_fake_ac = 1;
    +          }
    +        }
    + }
    + if( enable_fake_ac == 1 ){
    +        env->SetBooleanField(obj, gFieldIds.mAcOnline, true);
    +        env->SetBooleanField(obj, gFieldIds.mUsbOnline, false);
    +        env->SetBooleanField(obj, gFieldIds.mBatteryPresent, true );
    +        env->SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusCharging);
    +        env->SetIntField(obj, gFieldIds.mBatteryLevel, 50);
    +        env->SetIntField(obj, gFieldIds.mBatteryVoltage, 4000);
    +        env->SetIntField(obj, gFieldIds.mBatteryTemperature, 20);
    +        env->SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthGood);
    +        env->SetObjectField(obj, gFieldIds.mBatteryTechnology, env->NewStringUTF("Fake"));
    +   return;
    + }
    +
        setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);
        setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);
        setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);


可输入getevent查看输入设备信息
# getevent
could not get driver version for /dev/input/mice, Not a typewriter
add device 1: /dev/input/event1
  name:     "s3c TouchScreen"
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 2: /dev/input/event0

  name:     "helper2416_keypad"

作者:帅得不敢出门   c++哈哈堂群:31843264  转载请保留此信息

阅读(2398) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~