从linux驱动转行至Android驱动开发大半年了,一开始就产生了一个很纠结目标和问题,就是不停的google如何porting android!这个问题得到的结果对于初出茅庐的我,感到迷惘。随着工作的需要,自己的经验也就慢慢的增加,这些迷雾也慢慢解开,这里要多谢我自己的努力和老大高工的精心栽培。


言归正传,将android移植到特定硬件平台上,其核心是bsp的搭建工作,bsp是板级支持包,并不是特定某个文件,而是从功能上理解的一种硬件适配软件包,它的核心就是: 
1. linux内核硬件相关部分(主要是linux device drivers); 
2. android用户空间的硬件抽象层。(HAL,hardware abstract layer). 
linux驱动程序工作在内核空间,android的HAL工作在用户空间,有了这两个部分的结合,就可以让庞大的android系统运行在特定的硬件平台上。 
在具有了特定的硬件平台之后,为了适应不同版本的android系统,其BSP部分代码通常需要重写或者修改,此时设备驱动程序可以重用,硬件抽象层则需要修改。 
BSP工作和核心应该是原始的硬件底层。例如蓝牙耳机,蓝牙传输文件,蓝牙聊天等程序最终依赖的硬件是蓝牙;照相机、摄像机、条形码识别器等程序都依赖于底层的摄像头;自动转屏,晃动屏幕控制的各种游戏、都同样依赖于加速度传感器。 
目前一般的处理器或者硬件平台的BSP(board support package)都是由芯片厂商统一完成的,并且已经趋于成熟。因此开发者的主要工作不再是构建完整的BSP,而是调试和修改现有的BSP。其实每个芯片厂家都会有一个硬件平台的参考设计,如PMU,EMMC,WIFI,CODEC,CTP等。如果没有太大的改动,原厂的BSP一般都是可以跑起来的,针对某一块的硬件变化修改驱动和HAL就可以了,对于新增加的硬件,编写相关的驱动程序,然后提供给JAVA的本地框架层的接口就可以了。对于一些简单的设备驱动,可以不用写HAL的代码,实际上很多时候也不用去写,一种常见的情况是由JNI的部分代码直接调用驱动程序的设备节点或者使用sys文件系统。也可以直接把/sys/的属性文件(可以通过cat和echo读写)的文件接口直接提供给java层代码调用。


android的主要驱动有: 
1. 显示驱动 display driver:常用于基于linux的帧缓冲frame buffer 驱动程序。 
2. flash内存驱动flash memory driver :基于MTD的flash驱动程序。 
3. 照相机驱动camera driver :基于linux的v4l video for linux驱动。 
4. 音频驱动 audio driver :基于ALSA advanced linux sound architechure驱动。 
5. wifi驱动:基于IEEE801.31标准的驱动程序。 
6. 键盘驱动keyboard driver:作为输入设备的键盘驱动。 
7. 蓝牙驱动 bluetooth diver :基于IEEE801.35.1标准的无限传输技术。 
8. binder IPC驱动:android一个特殊的驱动程序,具有单独的设备节点,提供进程间通信的功能。 
9. power management能源管理:管理电池电量等信息。 
android**主要的库**有: 
1. C库,基于linux系统调用实现的库,C语言标准库,也是系统最底层的库。 
2. 多媒体框架 media framwork 
3. SGL:2D图像引擎 
4. SSL secure socket layer:为数据通信提供安全支持 
5. open GL:对3D提供支持 
6. 界面管理工具 surface management 
7. SQLite:一种通用的嵌入式数据库 
8. Webkit:网络浏览器的核心 
9. free type位图和矢量字体的功能 
android主要framework有: 
1. active 活动 
2. boardcast Intent Receiver广播意图接收者 
3. content Provider 内容提供者 
4. Intent and Intent filter 意图和意图过滤器 
android的application framework是为APP开发提供的API,实际上是一个应用程序框架,有谷歌规定好的API,JAVA开发人员直接使用。这一层提供的首先包涵UI程序所需要的控件,如View(视图控件),其中要包涵list,grid,text,box,button等,甚至一个嵌入式的web浏览器。

android BSP与硬件相关子系统读书笔记(1)android BSP移植综述的更多相关文章

  1. 【读书笔记】Android平台的漏洞挖掘和分析

    最近比较关注移动端的安全,以后也打算向安卓平台的安全发展.这篇博文主要是记录一些研究Android安全的读书笔记. Fuzzing技术的核心是样本生成技术 测试Android平台的组件间通信功能使用的 ...

  2. 【读书笔记《Android游戏编程之从零开始》】6.Android 游戏开发常用的系统控件(TabHost、ListView)

    3.9 TabSpec与TabHost TabHost类官方文档地址:http://developer.android.com/reference/android/widget/TabHost.htm ...

  3. 【读书笔记《Android游戏编程之从零开始》】2.Hello,World!

    本人看的是PDF文档,很多都是直接都是复制粘贴的记录,简单的记录下笔记! 2.1 创建一个Android项目 Application Name: 应用名称(安装在手机上显示的名字)Project Na ...

  4. 【读书笔记《Android游戏编程之从零开始》】1.Android 平台简介与环境搭建

    简单的记录下笔记,具体可百度! Android SDK (Software Development Kit)- Android 软件开发工具包,用于辅助Android 操作系统软件开发,是开发Andr ...

  5. 【读书笔记《Android游戏编程之从零开始》】5.Android 游戏开发常用的系统控件(ProgressBar、Seekbar)

    3.7 ProgressBar ProgressBar类官方文档地址:http://developer.android.com/reference/android/widget/ProgressBar ...

  6. 【读书笔记《Android游戏编程之从零开始》】4.Android 游戏开发常用的系统控件(EditText、CheckBox、Radiobutton)

    3.4 EditText EditText类官方文档地址:http://developer.android.com/reference/android/widget/EditText.html Edi ...

  7. 【读书笔记《Android游戏编程之从零开始》】3.Android 游戏开发常用的系统控件(Button、Layout、ImageButton)

    3.1 Button Button这控件不用多说,就是一个按钮,主要是点击后进行相应事件的响应. 给组件添加ID属性:定义格式为 android:id="@+id/name",这里 ...

  8. 【读书笔记《Android游戏编程之从零开始》】8.Android 游戏开发常用的系统控件(系统控件常见问题)

    Android 中常用的计量单位Android有时候需要一些计量单位,比如在布局Layout文件中可能需要指定具体单位等.常用的计量单位有:px.dip(dp).sp,以及一些不常用的pt.in.mm ...

  9. 【读书笔记《Android游戏编程之从零开始》】18.游戏开发基础(碰撞检测)

    1.矩形碰撞 所谓矩形碰撞,就是利用两个矩形之间的位置关系来进行判断,如果矩形的像素在另外一个矩形之中,或者之上都可以认为这两个矩形发生了碰撞. 如果单纯的去考虑哪些情况会判定两个矩形发生碰撞,倒不如 ...

随机推荐

  1. PL/SQL 08 异常 exception

    --PL/SQL错误  编译时  运行时 --运行时的出错处理  EXCEPTION --异常处理块DECLARE …BEGIN …EXCEPTION WHEN OTHERS THEN  handle ...

  2. Oracle基础 10 表 table

    --查看表的结构 desc ygb; select * from user_tab_columnswhere table_name='YGB'; --新建表ygb create table ygb(  ...

  3. 测试social_navigation_layers

    目标:测试social_navigation_layers 方法: 使用move_base接口启动costmap_2d 这样就能直接用configure方法来进行测试不用自己写代码 一.启动move_ ...

  4. JSON格式数据的js操作

    第一种方式: 使用js函数eval(); testJson=eval(testJson);是错误的转换方式. 正确的转换方式需要加(): testJson = eval("(" + ...

  5. 在Ubuntu 16.04安装 Let’s Encrypt并配置ssl

    1.安装前准备 1)要确保python的默认版本为2.7及以上版本. 2)需要配置的apache.nginx需要提前配置绑定域名. 2.安装ssl 在这个https://certbot.eff.org ...

  6. error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)'

    http://stackoverflow.com/questions/11990708/error-cant-connect-to-local-mysql-server-through-socket- ...

  7. hadoop 编译代码及运行

    搞定了hadoop配置之后,可以写代码运行了,首先要配一下CLASS_PATH,修改/etc/profile export JAVA_HOME=/usr/lib/jvm/java--openjdk-i ...

  8. mysql实现full outer join

    由于MySQL设计时不支持full outer join, 所以如果有全连接需求时,需要一点小技巧来实现. 假设有两个表t1,t2 full outer join 的效果和下面的效果一样: SELEC ...

  9. 「PKUWC 2018」随机算法 (第二版,正解做法)

    上一版貌似是打了 O(3 ^ N) 暴力和 一条链的情况,得了60分.... 第一次做的时候光想练一练暴力...就没去想正解,谁知道正解比暴力好写不知道多少,mmp 设 f(S) 为 选集合S中的点可 ...

  10. 【KMP】BZOJ3670-[Noi2014]动物园

    [题目大意][依然借用别人的概括]给定一个长为L的字符串(L<=100W),求一个num数组,num[i]表示长度为i的前缀中字符串S’的数量,其中S‘既是该前缀的前缀也是该前缀的后缀,且|S' ...