历史上的今天
今天是:2024年12月22日(星期日)
2021年12月22日 | S3C6410板子移植 Android2.2
2021-12-22 来源:eefocus
一:Android简介
1.什么是Android:
Android是一种基于linux的自由及开放源代码的操作系统,主要适用于移动设备,如智能手机和平板电脑,是由google公司和开放手机联盟领导和开发;
Android的系统架构和其操作系统一样,采用了分层的架构从架构图看,Android分为四个层:从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。如下图所示:

(1)应用程序层:所有安装在手机上的应用程序都是属于这一层的,就是一些应用程序(apk)
(2)应用程序框架层:这一层主要提供了构建应用时可能用到的API,Android自带的一些核心应用程序就是使用这些API完成的,开发者可以通过使用这些API构建自己的应用程序。比如有活动管理器、View系统。内容提供器、通知管理器等。
(3)系统运行库层:这这一层主要包含的是C/C++库来为Android系统提供了主要的特性支持,比如SQLite库提供了数据库的支持,同时还它提供了一些核心库,能允许开发者使用Java来编写Android应用,关键是Dalvik虚拟机,它使得我们每一个Android应用都能运行在独立的进程当中,并且拥有一个自己的Dalvik虚拟机实例,相比Java虚拟机(JVM),Dalvik是专门为移动设备定制的,它对手机内存、CPU性能有限等情况做了优化处理;
(4)Linux内核层:s3c6410板子上面跑的是Android2.2+linux-2.6.35;
Tiny4412:Android4.2.2 + linux-3.5; 这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、WiFi驱动、电源管理;
二、Android手机的移植
1、编译Android源码
在编译android原代码之前要卸载系统原有的openjdk,安装sun公司的jdk 1.5 (为了支持以后的Android上层的应用开发;)
yum remove openjdk*
yum remove gcc-java
安装jdk-1.5
rpm -ivh jdk-1.x-xxx.rpm
在此之前还需要配置yum 源(一般为163源,更新比较快)
2、设置环境变量
vim /etc/profile
加入:
PATH=$PATH:/usr/local/arm/4.5.1/bin
export JAVA_HOME=/usr/java/jdk1.5.0_22
export JRE_HOME=${JAVA_HOME}/jre
exportCLASS_PATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASS_PATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=${JAVA_PATH}:$PATH
现在就可以进入android2.2源码宝包进行编译了
cd .../android2.2
make
在编译android的过程中可能会遇到 :
gperf : command not found
gperf命令没有,于是乎就要安装,需要下载gperf包:
tar xf gperf *. tar.gz
./configure
make
make install
至此就静等android编译完毕(这个过程大概要4个小时左右)
3.编译Android内核(Linux-2.6.35)
在编译整个android结束后,就可以开始内核的编译了
vim Makefile
配置相应的编译平台及编译器
ARCH ?= arm
CROSS_COMPILE ?=/home/android/android1/android-2.2_froyo/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
make
4.烧写bootloader
设置sd卡启动,烧写bootloader到sd卡
在板子上选择sd卡启动
安装minicom软件(配置Minicom -s)
pc机上运行命令 minicom -s 选择第三个(配置如下图)

安装设置好tftp
yum install xinetd
yum install tftp
yum install-sever
配置tftp服务:
vim vi /etc/xinetd.d/tftp
disable = no
重启服务:
service xinetd restart
6.烧写bootloader到nandflash
将u-boot-nand.bin拷贝到 /var/lib/tftp目录下:
进入minicom
板子上面:tftp 52000000 u-boot-nand.bin
nand erase clean
nand write 52000000 0 3000
重启板子设置为nand falsh启动
5.搭建Android nfs 网络文件系统到开发板
安装nfs服务:
yum install nfs
在pc 机创建根文件系统目录
mkdir /work/android/nfsroot
配置nfs
vim /etc/export
/work/android/nfsroot *(rw,no_root_squash)
重启 nfs 服务
service nfs restart
将编译生成的Android源码的一下文件拷贝到nfsroot下面
cp root/* /work/android/nfsroot -rf
cp system/ /work/android/nfsroot/system -rf
cp data/ /work/android/nfsroot/data -rf
至此android nfs文件系统构建完毕
设置arm板的启动参数
setenv bootargs console=ttySAC0 init=/init root=/dev/nfs nfsroot=192.168.1.10:/work/android/nfsroot ip=192.168.1.20
Saveenv
将编译生成的内核镜像copy到/var/lib/tftp
启动板子
tftp 50008000 zImage
bootm 50008000
至此整个Android系统就可以在板子上面跑起来了
三、Android系统简单的应用程序及驱动的编写
Android触摸屏矫正(内核、Android源码)
首先我们需要在Android上面移植tslib:Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口;
下载 tslib, ./configure mmm 编
配置编译tslib 拷贝到nfsroot目录下 ts.conf
重新启动Android (ts_calibrate)
在android内核中运行ts_calibrate
利用ts_calibrate得到7个数值,填充到内核中的数组中,作为计算x,y的坐标的系数
矫正数据在.. nfsroot/system/etc/pointercal
至此触摸屏就可以工作了
LED内核驱动的编写
接下来的工作就是在应用写一个apk程序,调用Java的动态库jar,jar在通过jni调用内核中的C库,实现led的亮、灭
编写apk,jar,jni,kernel_module
编译的一个顺序
.so --> jni --> jar -->apk
Android.mk
include $(BUILD_PACKAGE) -->编译生成apk文件
include $(BUILD_JAVA_LIBRARY) -->编译生成动态jar库
include $(BUILD_STATIC_JAVA_LIBRARY) -->编译生成静态jar库
include $(BUILD_SHARED_LIBRARY) -->编译生成动态C库
开发板
insmod led.ko
chmod 777 /dev/s3c6410_led
代码如下:
首先了解下如何编译生成apk,jar,jni文件
1 #-------------- 1. APK ---------------
2 LOCAL_PATH := $(call my-dir)
3 LOCAL_SRC_FILES := $(call all-subdir-java-files)
4 LOCAL_PACKAGE_NAME := TestEvent
5
6 LOCAL_JAVA_LIBRARIES := cat
7 # in AndroidManifest.xml
8 # 9 # 10 # 12 LOCAL_STATIC_JAVA_LIBRARIES := 13 14 include $(BUILD_PACKAGE) 15 16 #-------------- 2. static JAR -------- 17 LOCAL_PATH := $(call my-dir) 18 LOCAL_SRC_FILES := $(call all-java-files-under, src) 19 LOCAL_MODULE := dog 20 21 LOCAL_JAVA_LIBRARIES := 22 LOCAL_STATIC_JAVA_LIBRARIES := 23 24 include $(BUILD_STATIC_JAVA_LIBRARY) 25 26 27 #-------------- 3. shared JAR ---------- 28 LOCAL_PATH := $(call my-dir) 29 LOCAL_SRC_FILES := $(call all-java-files-under, src) 30 LOCAL_MODULE := dog 31 32 LOCAL_JAVA_LIBRARIES := 33 LOCAL_STATIC_JAVA_LIBRARIES := 34 # in system/etc/permissions/platform.xml 35 # 37 38 include $(BUILD_JAVA_LIBRARY) 39 40 #-------------- 4. static c library ------- 41 LOCAL_PATH := $(call my-dir) 42 43 LOCAL_SRC_FILES := test-jni.c 44 LOCAL_MODULE := libtest-jni 45 46 LOCAL_SHARED_LIBRARIES := libc 47 LOCAL_STATIC_LIBRARIES := 48 49 include $(BUILD_STATIC_LIBRARY) 50 51 #-------------- 5. shared c library ------- 52 LOCAL_PATH := $(call my-dir) 53 54 LOCAL_SRC_FILES := test-jni.c 55 LOCAL_MODULE := libtest-jni 56 LOCAL_PRELINK_MODULE := false 57 58 LOCAL_SHARED_LIBRARIES := libc 59 LOCAL_STATIC_LIBRARIES := 60 61 include $(BUILD_SHARED_LIBRARY) 62 63 #-------------- 6. exectutable --------------- 64 LOCAL_PATH := $(call my-dir) 65 66 LOCAL_SRC_FILES := test.c 67 LOCAL_MODULE := test 68 LOCAL_SHARED_LIBRARIES := libc 69 LOCAL_STATIC_LIBRARIES := 70 71 include $(BUILD_EXECUTABLE) led的文件内容: 如下打开main.xml 我们可以制作apk的界面,我这个apk是实现的是两个按钮,btn_off, btn_on, 用来控制灯亮/灭 一个textview显示栏 vim /home/DREAM/src/8nd_led/apk/res/layout/main.xml 1 2 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" 6 > 7 9 android:layout_height="80dp" 10 android:id="@+id/txt" 11 android:textSize="30dp" 12 /> 13 15 android:layout_width="fill_parent" 16 android:layout_height="fill_parent" 17 > 18 31 vim /home/DREAM/src/8nd_led/apk/src/bunfly/pratice/Bunfly.java 1 package bunfly.pratice; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.widget.TextView; 6 import android.widget.Button; 7 import android.view.View.OnClickListener; 8 import android.view.View; 9 import com.device.led; 10 11 public class Bunfly extends Activity 12 { 13 TextView txt; 14 Button but_on, but_off; 15 OnClickListener listener; //监听 16 17 /** Called when the activity is first created. */ 18 @Override 19 public void onCreate(Bundle savedInstanceState) 20 { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.main); 23 txt = (TextView)findViewById(R.id.txt); 24 but_on =(Button)findViewById(R.id.but_on); 25 but_off = (Button)findViewById(R.id.but_off); 26 txt.setText("Please Click Button"); 27 but_on.setText("ON"); 28 but_off.setText("OFF"); 29 30 listener = new OnClickListener() { 
apk中的内容:
下一篇:Tiny4412之外部中断
史海拾趣
|
请问大侠s: 一个编译器中如何才能支持fopen等I/O操作呢?是不是C库中必须要包含相关的C库,我现在使用MDK的IDE,它内部有个自己的文件系统,但是我在SDRAM中调试运行的时候,发现运行fopen函数后,程序就跑飞了。我怀疑是fopen库函 ...… 查看全部问答> |
|
1) 内部资源 FPGA侧重于设计具有某个功能的硬件电路,内部资源是VersaTiles(Actel FPGA)之类的微小单元,FPGA的内部单元初始在编程前都是使用的是HDL语言实现硬件电路的设计描述。FPGA内部的连线资源将这些功能模块的内部和模块之间的信号连接起 ...… 查看全部问答> |
|
各大LED生产商在上游磊晶技术上不断改进,如利用不同的电极设计控制电流密度,利用ITO薄膜技术令通过LED的电流能平均分布等,使在结构上都尽可能产生最多的。再运用各种不同方法去抽出LED发出的每一粒光子,如生产不同外形的芯片;利用芯片周边有效 ...… 查看全部问答> |
|
寻求帮助:本公司原来使用AD421作为AD转换芯片,由于此种芯片有时出现缺货,且价格较高,造成产品成本增加。现在要进行更换,请那位高人知道有可以替代且价格低的AD转换芯片。 联系电话:15094358931 沈统阳… 查看全部问答> |
|
用430 产生一个spwm,我用的是规则采样,当载波比设置为129的时候波形正常,一旦超过129就会失真,如果设置成500那正弦波直接变为尖峰。不知道为什么,请教各位大神啊!!!!!!! 下面是我的程序: void Init(){ MyClkInit(); Chang ...… 查看全部问答> |




