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

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

kernel,下载地址:http://android.googlecode.com/files/linux-2.6.25-android-1.0_r1.tar.gz

根文件系统,用网上流传的armv4,下载地址:http://attachments.hiapk.com/download//soft/armv4.tar.gz
根文件系统源码 http://code.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 <errno.h>
#include <unistd.h>


+#include <cutils/properties.h>
+
+
#if HAVE_ANDROID_OS
#include <linux/ioctl.h>
#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 转载请保留此信息

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. 修改android4.4图库系列二——自定义菜单
  6. Android(安卓)SharedPreferences
  7. MyEclipse本地搭建Android环境
  8. cocos2dx使用Jsoncpp在android运行的问题
  9. 解决Debug certificate expired问题

随机推荐

  1. android 升级包检测并更新实现
  2. Android之SurfaceView实现视频播放
  3. Android(安卓)背景渐变 渐变背景 shape
  4. onRetainNonConfigurationInstance和getL
  5. ViewPager
  6. android 设置时区
  7. Android(安卓)网络开发详解
  8. Android自定义样式style.xml
  9. Android(安卓)分割线
  10. Excessive JNI global references - Andr