历史上的今天
返回首页

历史上的今天

今天是: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源码

  1. 在编译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

  1. 设置sd卡启动,烧写bootloader到sd卡

  2. 在板子上选择sd卡启动

  3. 安装minicom软件(配置Minicom -s)

  4. pc机上运行命令 minicom -s 选择第三个(配置如下图)

  5. 安装设置好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文件系统构建完毕

 

  1. 设置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系统简单的应用程序及驱动的编写

  1. Android触摸屏矫正(内核、Android源码)

  1. 首先我们需要在Android上面移植tslib:Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口;

  2. 下载 tslib, ./configure mmm 编

  3. 配置编译tslib 拷贝到nfsroot目录下 ts.conf

  4. 重新启动Android (ts_calibrate)

在android内核中运行ts_calibrate

利用ts_calibrate得到7个数值,填充到内核中的数组中,作为计算x,y的坐标的系数

矫正数据在.. nfsroot/system/etc/pointercal

 

至此触摸屏就可以工作了

  1. LED内核驱动的编写

接下来的工作就是在应用写一个apk程序,调用Java的动态库jar,jar在通过jni调用内核中的C库,实现led的亮、灭

  1. 编写apk,jar,jni,kernel_module

  2. 编译的一个顺序

.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         # 11 

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     # 36         #     file="/system/framework/cat.jar"/>

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的文件内容:


 apk中的内容:

 

   如下打开main.xml 我们可以制作apk的界面,我这个apk是实现的是两个按钮,btn_off, btn_on, 用来控制灯亮/灭 一个textview显示栏

 

   vim /home/DREAM/src/8nd_led/apk/res/layout/main.xml 


 1

 2  3     android:orientation="vertical"

 4     android:layout_width="fill_parent"

 5     android:layout_height="fill_parent"

 6     >

 7  8     android:layout_width="fill_parent" 

 9     android:layout_height="80dp"

10     android:id="@+id/txt"

11     android:textSize="30dp"

12     />

13     14         android:orientation="horizontal"

15         android:layout_width="fill_parent"

16         android:layout_height="fill_parent"

17         >

18         19             android:layout_width="60px"

20             android:layout_height="40px"

21             android:layout_weight="1"

22             android:id="@+id/but_on"

23         />

24         25             android:layout_width="60px"

26             android:layout_height="40px"

27             android:layout_weight="1"

28             android:id="@+id/but_off"

29         />

30     

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() {

推荐阅读

史海拾趣

晶群科技(Gem-micro)公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐中不可或缺的重要设备。它作为连接电视机与外部信号源的桥梁,不仅实现了传统电视信号的接收与转换,还通过数字化和网络化技术,极大地丰富了用户的观看体验。

从功能上看,机顶盒主要分为数字机顶盒和网络机顶盒两大类。数字机顶盒主要实现数模转换功能,让用户在模拟电视机上也能观看数字电视,包括有线电视、卫星电视和地面广播电视等多种信号源。而网络机顶盒则更进一步,能够接入互联网,提供包括在线视频、流媒体服务、游戏等在内的多元化娱乐选择。

在技术层面,机顶盒不断升级,逐步向高清、超高清乃至更高级别的视频标准迈进。同时,智能化技术的应用,如语音助手、智能推荐等,使得机顶盒的操作更加便捷,用户体验更加优越。此外,随着云计算和边缘计算技术的发展,机顶盒在内容分发和管理上也变得更加高效。

综上所述,机顶盒以其强大的功能和不断升级的技术,成为现代家庭娱乐的重要组成部分。它不仅满足了用户日益多样化的观看需求,还通过技术创新不断提升用户体验,引领着家庭娱乐的未来发展方向。

ACT [Advanced Crystal Technology]公司的发展小趣事

ACT(Advanced Crystal Technology)公司是一家专注于晶体技术的企业。以下是该公司发展的五个相关故事:

  1. 公司成立与起步阶段: ACT公司成立于1984年,总部位于美国加利福尼亚州。创始人致力于研究和开发高性能的晶体材料和晶振产品。公司最初是一家小型的研究型企业,致力于满足军事和航空航天领域对高精度晶振的需求。

  2. 技术创新和产品拓展: 随着市场需求的增长和技术进步,ACT公司不断进行技术创新,并扩展了产品线。公司推出了一系列高精度、高稳定性的晶振产品,覆盖了频率范围广泛的应用,包括通信、医疗、工业控制等领域。

  3. 市场拓展和国际化发展: ACT公司积极开拓国内外市场,并与全球各地的客户建立了合作关系。公司的产品不仅畅销于美国本土市场,还远销至欧洲、亚洲等国家和地区。通过与国际合作伙伴的合作,ACT逐步实现了国际化发展战略。

  4. 质量控制和技术支持: ACT公司注重产品质量和技术支持,建立了严格的质量控制体系和售后服务体系。公司拥有一支专业的研发团队和技术支持团队,为客户提供定制化的解决方案和技术支持,确保产品的稳定性和可靠性。

  5. 未来发展展望: ACT公司将继续致力于晶体技术领域的研发和生产,不断推出更先进、更高性能的晶振产品,以满足客户在不断变化的市场需求。公司将加强与客户的合作,深化技术创新,提升产品品质和服务水平,努力成为行业内的领先企业。

安普康(AMPCOM)公司的发展小趣事

对于安普康来说,品质是企业生存和发展的基石。自成立以来,公司始终将产品品质放在首位,从原材料采购到生产流程控制,再到产品测试和包装,每一个环节都严格把关。这种对品质的执着追求使得安普康的产品在市场上赢得了良好的口碑。无论是电信、移动、电力等大型企业,还是智能大厦、家庭用户等终端客户,都对安普康的产品给予了高度评价。

DRI Relays Inc公司的发展小趣事

DRI Relays Inc公司成立于XX年代,当时电子继电器市场正处于快速发展阶段。公司创始人XXX凭借对市场趋势的敏锐洞察,决定投身于这一领域。然而,创业之初,公司面临资金短缺、技术瓶颈和市场竞争激烈等多重挑战。为了突破困境,XXX带领团队日夜兼程地研发新产品,不断改进技术,同时积极寻找投资者。在一次行业展会上,公司的新产品因其独特的设计和高性能吸引了众多客户的关注,为公司赢得了宝贵的订单和资金支持。

Auris公司的发展小趣事

2019年,强生公司以34亿美元的价格收购了Auris Health。这次收购对于双方来说都具有重要意义。对于Auris而言,它获得了强大的资金支持和市场资源,有助于加速其产品的市场推广和技术研发。对于强生来说,它借此机会获得了Auris在呼吸道手术和肺癌检测方面的先进技术,进一步巩固了其在医疗领域的领先地位。

长工微电子公司的发展小趣事

为了进一步拓展市场,长工微电子积极寻求战略合作。近期,长工微电子与世强先进(深圳)科技股份有限公司签署战略合作协议,授权世强先进全线代理其旗下电源管理IC、开关转换器、多相控制器、降压电源模块、电子保险丝等产品。这一合作有助于长工微电子更好地满足客户需求,提高市场占有率。

问答坊 | AI 解惑

如何才能支持fopen等I/O操作

请问大侠s:     一个编译器中如何才能支持fopen等I/O操作呢?是不是C库中必须要包含相关的C库,我现在使用MDK的IDE,它内部有个自己的文件系统,但是我在SDRAM中调试运行的时候,发现运行fopen函数后,程序就跑飞了。我怀疑是fopen库函 ...…

查看全部问答>

FPGA与DSP综合比较

1) 内部资源 FPGA侧重于设计具有某个功能的硬件电路,内部资源是VersaTiles(Actel FPGA)之类的微小单元,FPGA的内部单元初始在编程前都是使用的是HDL语言实现硬件电路的设计描述。FPGA内部的连线资源将这些功能模块的内部和模块之间的信号连接起 ...…

查看全部问答>

大功率LED封装工艺及方案的介绍及讨论

各大LED生产商在上游磊晶技术上不断改进,如利用不同的电极设计控制电流密度,利用ITO薄膜技术令通过LED的电流能平均分布等,使在结构上都尽可能产生最多的。再运用各种不同方法去抽出LED发出的每一粒光子,如生产不同外形的芯片;利用芯片周边有效 ...…

查看全部问答>

RTC用内部的LSI,不知道精度怎么样?

                                 一天下来,能偏差多少秒?正在考虑用内部还是用外部的,麻烦用的朋友说一下,多谢!!!…

查看全部问答>

数字量转换为标准4-20na电流

寻求帮助:本公司原来使用AD421作为AD转换芯片,由于此种芯片有时出现缺货,且价格较高,造成产品成本增加。现在要进行更换,请那位高人知道有可以替代且价格低的AD转换芯片。   联系电话:15094358931   沈统阳…

查看全部问答>

关于FPGA的倍频

据说FPGA可以倍频,我的板子上是EP2CQ8Q208的芯片,50M的外部晶振,请问最大能倍频到多少啊。提前谢过啦…

查看全部问答>

FPGA运动目标跟踪

目前正在做fpga运动目标跟踪的工作,想找道友,有这方面研究经验的朋友,望你不吝赐教 qq398893820  …

查看全部问答>

430产生spwm波形问题

用430 产生一个spwm,我用的是规则采样,当载波比设置为129的时候波形正常,一旦超过129就会失真,如果设置成500那正弦波直接变为尖峰。不知道为什么,请教各位大神啊!!!!!!! 下面是我的程序: void Init(){ MyClkInit(); Chang ...…

查看全部问答>

怎样能够检查一个开关电源系统的稳定性

在这里需要求助各位哥哥姐姐,怎样能够检查一个开关电源系统的稳定性?…

查看全部问答>

430学习总结

430单片机确实和51有些差别,低功耗模式非常适合当前的发展趋势。丰富的时钟选择,及内部和外部资源。都决定了它是一款难学,好用,方便的单片机。强大的功能又对它的稳定性提出了挑战通过自己的学习,以及这几天帮助同学解决其中的问题,我同时对4 ...…

查看全部问答>