原创作品:http://write.blog.csdn.net/postedit/7956383
欢迎大家一起交流学习,知识在与分享。
希望结交一些志同道和之士
QQ: 474530676
longguopeng168@163.com
一、 安卓系统的组成
a. 应用层
b. 应用程序框架
c. 库和运行环境
d. 内核
e. 硬件
二、 移植的主要步骤
/*************************************************************************************/
1)安装sun JDK
开发环境:ubuntu 12.04 32位
a. 卸载系统中的open JDK,为了标准我们先把系统中的open JDK卸载掉,
把从网上下载的jdk-1_5_0_22-linux-i586.bin(47M)安装下就可以了.
b. 软件放在" /home/up6410/android/jdk-1_5_0_22-linux-i586.bin "目录下
// root@ubuntu-longguopeng:/home/up6410/android# ./jdk-1_5_0_22-linux-i586.bin
一直按回车,到底输入"yes" 安装好后,接下来就是要对这个配置文件进行配置。
配置的路径是/etc/profile.d/java.sh (这里要说明的一点是java.sh要临时创建),
里面配置的信息是:
// root@ubuntu-longguopeng:/# gedit /etc/profile.d/java.sh //ubuntu
// root@ubuntu-longguopeng:/# vim /etc/bashrc //rehl6
// root@ubuntu-longguopeng:/# sudo gedit ~/.bashrc
/*---------------------------------------------------------
//添加如下内容:
export JAVA_HOME=/home/up6410/android/jdk1.5.0_22
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
----------------------------------------------------------*/
c. 如何检测是否安装好jdk 在命令行输入:java –version
// root@ubuntu-longguopeng:/home/up6410/android# source ~/.bashrc
// root@ubuntu-longguopeng:/home/up6410/android# java -version
/*--------------------------------------------------------------------
//显示如下:
java version "1.5.0_22"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_22-b03)
Java HotSpot(TM) Server VM (build 1.5.0_22-b03, mixed mode)
注意:
root@longguopeng:~/桌面# java -version
root@longguopeng:~/桌面# java –version // –号错了
Exception in thread "main" java.lang.NoClassDefFoundError: –version
---------------------------------------------------------------------*/
若看到这个则说明成功。
d. 查看环境变量修改成功与否
在命令行中输入:
// root@ubuntu-longguopeng:/home/up6410/android# echo $JAVA_HMOE
// root@ubuntu-longguopeng:/home/up6410/android# echo $CLASSPATH
2) 编译android 2.2 froyo
文件存放在:/home/up6410/android/android-2.2_froyo
a. 对其进行解压:
// root@ubuntu-longguopeng:/home/up6410/android# tar –xvf android-2.2_froyo.tar.gz
//这是把这个解压到当前目录
b. cd 进入到这个目录中去:
// root@ubuntu-longguopeng:/home/up6410/android# cd android-2.2_froyo
c. 安装各种包
// root@ubuntu-longguopeng:/home/up6410/android# sudo aptitude install \
// git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev \
// build-essential zip curl libncurses5-dev zlib1g-dev
d. 编译
// root@ubuntu-longguopeng:/home/up6410/android/android-2.2_froyo# source build/envsetup.sh
// root@ubuntu-longguopeng:/home/up6410/android/android-2.2_froyo# lunch
// root@ubuntu-longguopeng:/home/up6410/android/android-2.2_froyo# make -j2
//双核双线程编译
首次编译非常耗时,取决于机器配置,大约需要2-3小时。
有可能会出现:“Permission denied (权限拒绝的提示)”
请命令赋予权限:$cd 无权限文件的当前目录 回车; $sudo chmod -R +rwx * 回车
完成后镜像生成在/root/mydroid/out/target/product/generic下:android源码编译后得到
system.img,ramdisk.img,userdata.img映 像文件。
-->ramdisk.img是emulator的文件系统,
-->system.img包括了主要的包、库等文件,
-->userdata.img包括了一些用户数 据,emulator加载这3个映像文件后,
会把 system和 userdata分别加载到 ramdisk文件系统中的system和 userdata目录下。
主要一点是要把上步的那个JDK装好后遇到的问题就比较的少,我在编译个过程中遇到的问题也就是一些命令
提醒说没有安装而已,我用apt-get install xxx安装下就可以了。
编译完后再会告诉你编译的东西出来东西在哪,而且也不会报错,也不会报警告。
/*******************************************************************************************************/
// 第六章 编译完成,模拟器运行Android
1)编译完成后,模拟器的实现与运行
a.模拟器的实现
把类文件系统目录下out/target/product/generic/system复制到out/target/product/generic/root下面去
// root@ubuntu-longguopeng:/home/up6410/android/android-2.2_froyo#
// cp -rf out/target/product/generic/root/* /home/up6410/nfsroot
// cp -rf out/target/product/generic/data /home/up6410/nfsroot
// cp -rf out/target/product/generic/system /home/up6410/nfsroot
设置环境变量
在 /etc/profile.d/java.sh最后加入那么一句
// root@ubuntu-longguopeng:/# vim /etc/profile.d/java.sh
/*-------------------------------------------------------------------------------------
//添加如下内容:
export JAVA_HOME=/home/up6410/android/jdk-1_5_0_22-i586.bin
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export PATH=$PATH:/home/up6410/android/android-2.2_froyo/out/host/linux-x86/bin //这里
--------------------------------------------------------------------------------------*/
b.模拟器运行
命令行中输入:emulator –shell
// root@ubuntu-longguopeng:/# emulator -skin 800x600
或
// root@ubuntu-longguopeng:/home/up6410/android/android-2.2_froyo/out/target/product/generic# which emulator
ANDROID_PRODUCT_OUT='pwd'/out/target/product/generic emulator
4)实现编译器的静态链接
先下载一个软件:arm-none-linux-gcc的软件,先对它进行解压后进入/bin目录下就有这条命令(arm-none-linux-gnueabi-gcc),arm-none-linux-gnueabi-gcc –static test.c –o test,
Cp test out/target/product/generic/system/bin
Mkyaffs2image system system.img
Emulator –shell
#test 这就会出现刚才你新建的命令中写的东西
5)实现android自带的编译器
cd <android home>
. build/envsetup.sh //点后面记得要有空格
mmm <你想编译的目录>
在做上几步之前要先做这步:
首先要先创建Android.mk文件,里面填写内容如下:
LOCAL_PATH := $(call my-dir)
include $(BUILD_JAVA_SHARED_LIBRARY)
LOCAL_SRC_FILE := test.c
LOCAL_MODULE := test
LOCAL_SHARED_LIBRAYR := libc
include $(BUILD_EXECTALE)
//=========================================================================================
// 第十四章 烧写Bootloader开发板
编译定制 u-boot:
第一步:
// [root@longguopeng:/#] tar -vxf /home/up6410/src/u-boot-1.1.6.tar.bz2
// [root@longguopeng:/#] cd /home/up6410/src/u-boot-1.1.6
第二步:
进到u-boot-1.1.6 定制u-boot 文件
1. 删除不需要的文件
留下:
arm-config.mk
config.mk
Makefile
MAKEALL
mkconfig
mknand //没有
mkmovi //没有
write-sd //没有
tags //没有
README
rules.mk
System.map
u-boot
u-boot.map
u-boot.bin
u-boot.dis
u-boot.sre.c
board //进到samsung,留下smdk6410,其他的全部删除
common
cpu
disk
drivers
dtt
examples
fs
include
lib-arm
lib-generic
nand-spl
net
post
rtc
tools
2. 删除完毕,改u-boot-1.1.6_smdk6410 下的Makefile
// [root@longguopeng:/#] cd /home/up6410/src/u-boot-1.1.6/
// [root@ubuntu-longguopeng:/home/up6410/src/u-boot-1.1.6#] vim Makefile
---------------------------------------------------------------------------
将193行改为
193: ARCH := arm
CROSS_COMPILE := arm-linux-
(记得最后面不要加空格!)
-----------------------------------------------------------------------------
// [root@longguopeng:/home/up6410/src/u-boot-1.1.6#] gedit include/configs/up6410_sd.h
3. 增加run 命令:
171: CFG_CMD_RUN | \ 调到 165: CFG_CMD_RUN | \
ubuntu@longguopeng # set wnf .......
4. 可以修改环境变量:
---------------------------------------------------------------------------------------------
182: #define CONFIG_BOOTARGS "root=/dev/nfs rw nfsroot=10.1.0.168:/home/up6410/nfsroot ip=10.1.0.168:10.1.0.167:10.1.0.255:255.255.255.0:www.longguopeng.com:eth0:off console=ttySAC0,115200 mem=128M"
183: #define CONFIG_ETHADDR 00:16:41:AA:90:48 //max地址
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 10.1.0.167 //开发板
#define CONFIG_SERVERIP 10.1.0.168 //pc机
#define CONFIG_GATEWAYIP 10.1.0.255 //网关
203:PTF-PROMPT "ubuntu@longguopeng #" 改工作环境的显示的名称
---------------------------------------------------------------------------------------------
// SD启动
[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] make up6410_sd_config
[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] make
[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] cp u-boot.bin /home/up6410/tftpboot/
[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] cd /home/up6410/tftpboot/
[root@longguopeng:/home/up6410/tftpboot/#] cp u-boot.bin u-boot-sd.bin
或
// NVND启动
[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] make up6410_nand_config
[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] make
[root@longguopeng:/home/up6410/src/u-boot-1.1.6#] cp u-boot.bin /home/up6410/tftpboot/
[root@longguopeng:/#] cd /home/up6410/tftpboot/
[root@longguopeng:/home/up6410/tftpboot#] cp u-boot.bin u-boot-nand.bin cd
写u-boot到nand flash:
uboot下操作:
ubuntu@longguopeng # nand erase 0 0x40000
ubuntu@longguopeng # tftp 0x50000000 u-boot-nand.bin
ubuntu@longguopeng # nand write 0x50000000 0 0x40000
//=====================================================================================================
第十五章 构建Android系统到S3C6410开发板
编译内核
修改makefile
191 ARCH ?= arm //平台
CROSS_COMPILE ?= ...eabi- //交叉编译器的前缀
//android-kernel-2.6.35.tar
[root@longguopeng android-kernel-2.6.35]# rm up6410_config* //删除
[root@longguopeng android-kernel-2.6.35]# cp .config android_config
[root@longguopeng android-kernel-2.6.35]# make
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
bootm 50008000
构建NFS 修改方便
[root@longguopeng android-kernel-2.6.35]# vim /etc/export
--------------------------------------------------------
//写入:
/home/up6410/nfsroot *(rw,no_root_squash)
---------------------------------------------------------
生成根文件系统
//android-2.2_froyo.tar
在这个文件里 /home/android/android-2.2_froyo
[root@longguopeng /]# mkdir /home/android/nfsroot
[root@longguopeng/]# cd /home/android-2.2_froyo/out/target/product/generic/
拷贝文件
[root@longguopeng generic]# cp -rf root/* /home/android/nfsroot
[root@longguopeng generic]# cp -rf system /home/android/nfsroot
[root@longguopeng generic]# cp -rf data /home/android/nfsroot
下载内核
将编译好的内核拷贝到tftpboot
[root@longguopeng android-kernel-2.6.35]# cp arch/arm/boot/zImage /tftpboot
启动uboot (在uboot下)
longguopeng @ # bootm
出现企俄说明内核没有问题
filesystem could mount //没有文件系统 死机强行启动
内核启动出现的问题
======================================================================
Freeing init memory: 164k
kernel panic - not syncing: no init fount.....
// 同步
// 默认启动在 [root@longguopeng nfsroot]# /sbin/init
// /etc/inittab 其他的
/init.rc 安卓的
======================================================================
在uboot下设置
setenv bootargs console=ttySAC0 root=/dev/nfs root=/dev/nfs rw nfsroot=10.1.0.168:/home/up6410/nfsroot ip=10.1.0.167:10.1.0.168:10.1.0.1:255.255.255.0:www.longguopeng.com:eth0:off init=/init
//开发板不显示文字 ( 添加init进程)
重启ip
bootm 50008000
在 [root@longguopeng nfsroot]# rm -f int.rc
//android_patch.tar
[root@longguopeng nfsroot]# cp /home/android_patch/init.rc ./
比较区别
[root@longguopeng nfsroot]# vimdiff init.rc /home/android-2.2_froyo/out/target/product/generic/root/init.rc
重新启动内核 第一次启动比较久 ,要写数据
# test
#
#
#
/**************************************************************************************************/
第十六章 视频驱动触摸屏部分
// 在文件夹 android-2.2_froyo.tar
LCD 分辨率 480 272
原始坐标
-->公式
-->lcd 新的坐标
现在比较常用的是: tslib 它是一个库
-->在 android_patch/tslib_android/
vim Android.mk
配置
./configure
vim Android.mk
-------------------------------------------------------
去掉这行LOCAL_PRELINK_MODULE=false
/system/lib/ts/plugins/input.so
//打开应用程序动态库
dlopen("input.so")
顺序执行编译
LOCAL_PATH:= $(call my-dir) //只能编译一次
名字
TSLIB PLUGINDIR := /system/lib/ts/plugins
//存放路径
LOCAL_MODULE :=ts/plugins/input
编译多个使用
include $(CLEAR_VARS) //开始
.......
.......
.......
include $(BUILD_SHARED_LIBRARY) //结束
--------------------------------------------------------
[root@longguopeng android-2.2_froyo]# . build/envsetup.sh
[root@longguopeng android-2.2_froyo]# mmm /android/android_patch/tslib_android //编译
//拷贝文件系统
[root@longguopeng android-2.2_froyo]# cp -rf out/target/product/generic/system /home/up6410/android/nfsroot
启动minicom
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
// android触摸屏的校正
启动起来后点击下屏却没有反应,我这个开发板用的是tft电阻屏,虽然在内核中有触摸屏驱动,
但是没校正屏幕的驱动,依然无法使用,linux中有一款开源的软件软件,名字是tslib,能够为触摸
屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。
步骤为:
首先先要从网上下载一个tslib的软件,对其进行解压。
tar –xvf xxx.tar.gz2(这是解压到当前文件夹)。
解压完之后进入到目录中:cd xxx/,
用编辑器vim打开里面的一个叫Android.mk文件,在他的第几行处加入这么一行,保存退出。
执行 ./configure,在回到<android home>目录中,把刚才解压出来的目录编译进android内核中去,执行命令:
. bulid/envsetup.sh
mmm <你所执行文件的目录>
先把/nfsroot中的system删除,在从文件系统中的system复制到删的位置。
先把<kernel home>/driver/input/touchscreen/s3c2410.c中的第几行注解掉
接着就把开发板和pc机连接起来,把android启动起来,启动后再android shell中输入ts_calibrate,
你会发现会报说没有ts.conf这个文件,接下来我们就来讲下怎样得到这个文件。
执行完后再接着做这个步骤:
cp tslib/etc/ts.conf /nfsroot/system/etc -rf
这个文件复制完后在执行ts_calibrate这条命令时就不会保错了,在开发板上会出现要你校屏的界面
你就用手或其他对屏进行校正,校正完后参数保存在 system/etc/pointercal下,在把这个参数复制到
<kernel home>/driver/input/touchscreen/s3c2410.c下,把
刚才注解掉的参数中这边新复制过来的替换掉。(这里要重新编译内核,这要记得不然是没效的)。
读取设备
目录 frameworks/base/libs/ui/EventHub.cpp
-----------------------------------------------------------------------
opend device
读取函数int EventHub::read_notify(int nfd)
------------------------------------------------------------------------
//JAVA代码
目录 frameworks/base/services/java/com/android/server/InputDevice.java
--------------------------------------------------------------
//self
783:final int pointtercal[]={
-11996, 12, 40642976, -6, -11296,31608176, 65536
}; // 从 /work/android/nfsroot/system/etc/pointercal 获取的
generateAbsMotion()
-------------------------------------------------
编译
[root@longguopeng android-2.2_froyo]# mmm frameworks/base/services/java/ //从这里开始编译
[root@longguopeng android-2.2_froyo]# cp out/target/product/generic/system/framework/services.jar /android/nfsroot/system/framework
启动内核
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
在内核里 矫正: 比较常用
drivers/input/touchscreen/s3c2410_ts.c
input_report_key(ts.input, BIN_TOUCH, 0)
input_report_abs(ts.input, ABS_PRESSURE, 0)
24课 android 烧写到nandflash
查看大小
du -sh
128M
磁盘镜像
只支持yaffs文件系统
编译 busybox --》终端命令不够用
在up6410里
在busybox里 make menuconfig
先将文件系统 nfsroot拷到/home/up6410/nfsroot
root@longguopeng:/home/up6410/# cp nfsroot android_nfsroot
root@longguopeng:/home/up6410/# mv android_nfsroot nfsroot/
进入nfs文件系统里运行:
# /busybox mount -t yaffs2 /dev/block/mtdblock3 /mnt/
# /busybox cp nfsroot/ mnt/ -rf
链接到bosybox
拷贝到
0
1
2
代表
地址代表什么
挂载
/busybox cp -rf
错误怎么会是??
重启一下
拔掉网线--
********************************************
19课
u-boot的启动过程
分两个阶段:
1.a.硬件初始化
b.为加载bootloader的第二阶段准备RAM空间。
要准备的东西有:汇编指令手册,uboot代码详细分析,书,makefile手册。
汇编指令:
mrs:这条指令的意思是用来读取psr(cpsr,spsr)中的数据读到Rn中。
str:把寄存器的值放到内存中
ldr:把内存中的值加载到寄存器中
reset:
mrs r0,cpsr //这段代码的意思是把cpu的模式改为管理员模式
bic r0,r0,#0x1f
orr r0,r0,#0xd3
msr cpsr,r0 //把r0中的值读回cpsr中
第十五章 构建Android nfs文件系统到开发板
11)、内核的编译
Tar –xvf xxx.tar.gz2
Cd xxx
在makefile中改下编译工具的路径,然后就可以开始编译了。在命令行输入make –j4
编译完就可以了。编译完后把编译出来的zImage复制到/tftproot下就行了。现在还差个android系统,之前在前面我们已将把它编译完成了。
12)、android系统的构建
<android home>/out/target/product/generic/下的root、data、
System组成一个nfsroot文件夹,操作演示如下:
cp –rf <android >/out/target/product/generic/root/* /nfsroot/
cp –rf <android >/out/target/product/generic/system /nfsroot/
cp –rf < android >/out/target/product/generic/data/ /nfsroot/
/nfsroot/这个就是类似linux中的文件系统,这个就是安卓系统。
在电脑与开发板之间连线和设置开发板的环境,开发板的主要环境还是先装下minicom 这个软件和tftp、nfs服务等,装好这些之后就可以开始下载了。
13)、android 系统的下载
先在命令行中输入minicom –s,设置端口参数,这里就不在多说了。在这之前要把arm板与pc电脑相连接好,进入了u-boot界面后,就要开始设置一些环境参数了。开发板的IP,电脑的IP,gatewayip,bootargs等,如下所示:
setenv bootargs console=ttySAC0 root=/dev/nfs nfsroot=2.2.2.254:/nfsroot ip=2.2.2.20
setenv serviceip=2.2.2.254
setenv ip=2.2.2.20
下载过程:
tftp 50008000 zImage bootm 50008000
在u-boot界面下输入这两条命令后就行了,系统就能启动起来了,要记得在这个期间,串口线和网线不能段,应为我们只是把内核和文件系统放到arm板的内存中去运行的还没保存到硬盘(nandflash)中,所以在运行中数据在通信是不能断开的,而且断电后又要重新烧写。
14)、android触摸屏的校正
启动起来后点击下屏却没有反应,我这个开发板用的是tft电阻屏,虽然在内核中有触摸屏驱动,但是没校正屏幕的驱动,依然无法使用,linux中有一款开源的软件软件,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。