板子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 转载请保留此信息
阅读(2469) | 评论(0) | 转发(0) |