导航:首页 > 操作系统 > androidnandflash

androidnandflash

发布时间:2023-01-20 10:15:46

androidlinux的区别

有以下三点区别:

1、Android没有本地窗口系统,而Linux是有X窗口系统。

2、Android没有glibc支持,而Linux是有glibc支持的。

3、Android是有自己专有的驱动程序。

虽然Android基于Linux内核,但是它与Linux之间还是有很大的差别。

(1)androidnandflash扩展阅读

Android专有的驱动程序

1、Android Binder 基于OpenBinder框架的一个驱动,用于提供 Android平台的进程间通信(InterProcess Communication,IPC)功能。源代码位于drivers/staging/android/binder.c。

2、Android电源管理(PM) 一个基于标准Linux电源管理系统的轻量级Android电源管理驱动,针对嵌入式设备做了很多优化。源代码位于:

kernel/power/earlysuspend.c

kernel/power/consoleearlysuspend.c

kernel/power/fbearlysuspend.c

kernel/power/wakelock.c

kernel/power/userwakelock.c

3、低内存管理器(Low Memory Killer) 比Linux的标准的OOM(Out Of Memory)机制更加灵活,它可以根据需要杀死进程以释放需要的内存。源代码位于 drivers/staging/ android/lowmemorykiller.c。

4、匿名共享内存(Ashmem) 为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。源代码位于mm/ashmem.c。

5、Android PMEM(Physical) PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。源代码位于drivers/misc/pmem.c。

6、Android Logger 一个轻量级的日志设备,用于抓取Android系统的各种日志。源代码位于drivers/staging/android/logger.c。

7、Android Alarm 提供了一个定时器,用于把设备从睡眠状态唤醒,同时它还提供了一个即使在设备睡眠时也会运行的时钟基准。源代码位于drivers/rtc/alarm.c。

8、USB Gadget驱动 一个基于标准 Linux USB gadget驱动框架的设备驱动,Android的USB驱动是基于gaeget框架的。源代码位于drivers/usb/gadget/。

9、Android Ram Console 为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备里,它是一个基于RAM的Buffer。源代码位于drivers/staging/android / ram_console.c。

10、Android timed device 提供了对设备进行定时控制的功能,目前支持vibrator和LED设备。源代码位于drivers/staging/android /timed_output.c(timed_gpio.c)。

参考资料:网络——Android

网络——linux

⑵ android 模拟器怎么模拟nmea

Android中提供了一个模拟器来模拟ARM核的移动设备。Android的模拟器是基于QEMU开发的,QEMU是一个有名的开源虚拟机项目 ,它可以提供一个虚拟的ARM移动设备。Android模拟器被命名为goldfish,用来模拟包括下面一些功能的ARM SoC:
* ARM926ej-S CPU
* Thumb support
* MMC
* RTC
* Keyboard
* USB Gadget
* framebuffer
* TTY driver
* NAND FLASH
Android模拟器所对应的源代码主要在external/qemu目录下。如果你想将Android移植到其他设备上,熟悉它目前所针对的模拟器环境可以提供一些参考。
对于应用程序的开发者,模拟器提供了很多开发和测试时的便利。无论在Windows下还是Linux下,Android模拟器都可以顺利运行,并且Google提供了Eclipse插件,可将模拟器集成到Eclipse的IDE环境。当然,你也可以从命令行启动Android模拟器。
这款模拟器功能非常齐全,电话本、通话等功能都可正常使用(当然你没办法真的从这里打电话)。甚至其内置的浏览器和Google Maps都可以联网。用户可以使用键盘输入,鼠标点击模拟器按键输入,甚至还可以使用鼠标点击、拖动屏幕进行操纵。
当然模拟器毕竟是模拟器,和真实的机子还是存在差别的,
android模拟器和真机的不同之处:
* 不支持呼叫和接听实际来电;但可以通过控制台模拟电话呼叫(呼入和呼出)
* 不支持USB连接
* 不支持相机/视频捕捉
* 不支持音频输入(捕捉);但支持输出(重放)
* 不支持扩展耳机
* 不能确定连接状态
* 不能确定电池电量水平和交流充电状态
* 不能确定SD卡的插入/弹出
* 不支持蓝牙
2、创建和启动Android模拟器
要玩GPhone的模拟器,当然需要先去http://developer.android.com/sdk(如果打不开就用http://androidappdocs.appspot.com/sdk/index.html)上面下载Android 的SDK,解压出来后在SDK的根目录下有一个tools文件夹,里面就是模拟器和一些非常有用的工具。(SDK详细的安装过程请参照 http://blog.csdn.net/magicyu2/archive/2009/11/02/4755747.aspx)
要正确的启动模拟,你必须先要创建一个 AVD( Android Virtual Device 虚拟设备 ),你可以利用AVD创建基于不同版本的模拟器,下面就介绍如何创建AVD:

(1) 查看当前支持版本(在列出的版本中我们需要记住id值,这个值在第2步中使用):
magicyu@magicyu-desktop:~$ android list target
你可以看到几个Available Android targets,比如:Name: Android 1.6,他们有各自的id号。
(2) 创建AVD:
magicyu@magicyu-desktop:~$ android create avd -n magicyu -t 2
-n后面接需要创建avd的名字,-t后面接需要创建虚拟器的类型,2即为步骤(1)中得到的类型id号。
(3) 查看是否创建成功(如果成功会显示刚才我们创建的avd信息):
magicyu@magicyu-desktop:~$ android list avd
(4) 启动模拟器:
magicyu@magicyu-desktop:~$ emulator @magicyu 或者
emulator -avd magicyu
其中@和-avd后接的是你创建过的avd名字
(5) 选择启动的皮肤
magicyu@magicyu-desktop:~$ emulator -avd magicyu -skin QVGA
skin后面接所要启动皮肤的类型,所有的类型可以在/ platforms/android-1.*/skins目录下找到,*为所指的版本。如在1.6版本的SDK下有HVGA,QVGA, WVGA800,WVGA854几种。按Ctrl+F11,可以直接改变模拟器的横纵摆放。
当然AVD也可以在Eclipse中创建和启动。关于Eclipse+ADT+SDK的安装请参见http://blog.csdn.net/magicyu2/archive/2009/11/02/4755747.aspx。
运行Eclipse,Window->Android SDK and AVD Manager,就能得到如下的界面,选择新建即可新建一个AVD。
3、Android模拟器的一些工具
(1)adb:
ADB(Android Debug Bridge)是Android 提供的一个通用的调试工具,借助这个工具,我们可以管理设备或手机模拟器的状态还可以进行以下的操作:
a、快速更新设备或手机模拟器中的代码,如应用或Android系统升级;
b、在设备上运行shell命令;
c、管理设备或手机模拟器上的预定端口;
d、在设备或手机模拟器上复制或粘贴文件
一些常用的操作:
进入Shell: adb shell
通过上面的命令,就可以进入设备或模拟器的shell环境中,在这个Linux Shell中,你可以执行各种Linux 的命令,另外如果只想执行一条shell命令,可以采用以下的方式:
adb shell [command]
如:adb shell dmesg会打印出内核的调试信息。
(Android的linux shell做了大量精简,很多linux常用指令都不支持)
上传文件: adb push
下载文件: adb pull
安装程序: adb install
卸载软件: adb shell rm /data/app/
补充一点,通过adb安装的软件(*.apk)都在”/data/app/”目录下,所以安装时不必制定路径,卸载只需要简单的执行”rm”就行。
结束adb: adb kill-server
显示android模拟器状态:
adb devices (端口信息)
adb get-proct (设备型号)
adb get-serialno (序列号)
等待正在运行的设备: adb wait-for-device
端口转发: adb forward adb forward tcp:5555 tcp:1234
(将默认端口TCP 5555转发到1234端口上)
查看bug报告: adb bugreport
adb shell sqlite3 访问数据库SQLite3
adb shell logcat -b radio 记录无线通讯日志: 一般来说,无线通讯的日志非常多,在运行时没必要去记录,但我们还是可以通过命令,设置记录
应用程序配置文件:
“AndroidManifest.xml”中
“”
决定是否应用程序是否显示在Panel上
(2)am指令(在shell内使用am来加载android应用):
am [start|instrument]
am start [-a ]
[-d ]
[-t ]
[-c [-c ] …]
[-e [-e ...]
[-n ] [-D] []
am instrument [-e ]
[-p ]
[-w]
启动浏览器:
am start -a android.intent.action.VIEW -d http://www.google.cn/
拨打电话:
am start -a android.intent.action.CALL -d tel:10086
启动google map直接定位到北京:
am start -a android.intent.action.VIEW geo:00?q=beijing
(3)为模拟器加上SD卡:
emulator -sdcard dcard.img
下面我们再来说说如何创建”sdcard.img”文件:
“tools”目录下还有另外一个很好用的工具mksdcard,一看名字就知道——make sdcard。对,就用它来创建一个“SD卡”。
命令为:
mksdcard 1024M D:dcard.img
OK这样一个容量为1G的SD卡就创建完毕了。
使用SDCard:
创建: mksdcard
(bytes(default),K,M)
连接到模拟器: emulator -sdcard
传文件到SDCard: adb push
(4)Android模拟器打电话发短信
GPhone的模拟器有个特有的号码:15555218135,这个就类似我们实体手机的SIM卡号码啦。要实现拨号,用手机?当然不行!
更简单,三步:
1.打开终端
2.连接: telnet localhost 5554(5554是你打开模拟器后上面显示的数字)
3.命令:gsm call 15555218135
look!是不是模拟器上显示来电了?接听/挂断和实体手机一样。
发短信也一样简单,重复上面1,2两步,第三部命令改一下:
sms send 15555218135 Hellothis is a Message.
4、Android模拟器主要命令参数介绍
emulator [- []] … [-]
下面的表总结了可用的参数
Help
-help打印模拟器参数列表。
-help-all打印所有启动参数明细。
-help-打印指定启动参数的信息。
-help-debug-tags打印所有被-debug 打开的列表。
-help-disk-images打印正在使用的磁盘镜像信息。
-help-environment打印模拟器环境变量信息。
-help-keys打印当前的键盘映射。
-help-keyset-file打印一个自定义的键盘映射文件的定义。
Disk Images
-cache 使用 指定网络缓存分区镜像。
自定义,您可以指定一个当前工作目录的相对路径。如果没有指定缓存文件,模拟器会指定一个零时文件作为缓存文件。更多信息请参考-help-disk-images.
-data 使用作为用户数据磁盘镜像。
自定义,您可以指定一个当前工作目录的相对路径。如果-data没有被使用,模拟器会在指定的目录下寻找名叫”userdata-qemu.img”的镜像文件。默认情况下,模拟器会寻找~/.android (on Linux/Mac)或者C:Documents and Settings/Local SettingsApplication DataAndroid (on Windows)。
如果您使用了-data ,但是文件并不存在,模拟器将创建同名文件。
更多信息请参见运行多个模拟器实例和-help-disk-images。
-image 使用作为系统镜像。
自定义,您可以指定一个当前工作目录的相对路径。默认为/system.img。
-initdata
重写用户数据镜像时,(使用 -wipe-data),复制此文件内容到新用户数据文件镜像中。默认方式下,模拟器拷贝/userdata.img。
自定义,您可以指定一个当前工作目录的相对路径。参见-wipe-data。
更多信息请参见-help-disk-images。
-kernel 使用作为模拟器内核。自定义,您可以指定一个当前工作目录的相对路径。
-nocache启动模拟器时无缓存分区。参见-cache 。
-ramdisk 使用作为虚拟内存镜像。默认为/ramdisk.img. 自定义,您可以指定一个当前工作目录的相对路径。更多信息请参见-help-disk-images。
-sdcard 使用作为SD卡镜像。默认为/sdcard.img. 自定义,您可以指定一个当前工作目录的相对路径。更多信息请参见-help-disk-images。
-system 在指定的下搜索系统、虚拟内存和用户数据镜像文件。为当前路径的相对目录。
-wipe- data重至用户数据镜像文件。(that is the file specified by -datadir and -data or the default file). 模拟器删除所有用户数据,然后复制右-inidata参数指定的数据到镜像文件,在启动之前。参见-initdata. 更多信息请参见-help-disk-images。
Debug
-debug 开启/关闭指定tag的调试信息。
是一个被空格/逗号/纵列所分割的调试组建名称列表。更多信息参见-help-debug-tags。
-debug-开启/关闭指定tag的调试信息。使用-help-debug-tags获得您可以指定为的调试组件列表。
-debug-no-关闭指定tag的调试信息。
-logcat 打开指定tag的日志输出。如果环境变量ANDROID_LOG_TAGS被指定且不为空,她的值将成为日志输出的默认值。
-shell创建一个拥有root权限的命令行窗口。即使模拟器的UI界面无法使用了,您依然可以使用命令行窗口。按Ctr-c键中断模拟器运行。
-shell-serial 打开具有root权限的脚本窗口。必须是一个QEMU类型的设备。参见’serial -dev’在 http://www.bellard.org/qemu/qemu-doc.html#SEC10上关于设备类型的列表信息。这儿有一些例子:
· -shell-serial stdio is identical to -shell
· -shell-serial tcp::4444servernowait 让您的shell可以通过4444端口通讯。
· -shell-serial fdpair:3:6 让模拟器可以使用3 (in)和6(out)磁盘机。
· -shell-serial fdpair:0:1 uses the normal stdin and stdout fds except that QEMU won’t tty-cook the data.
-show-kernel 显示内核信息。
-trace Enable code profiling (press F9 to start) written to a specified file.
-verbose 开启冗长输出。Equivalent to -debug-init. 您可以定义ANDROID_VERBOSE环境变量作为冗长输出参数。定义你想用到的参数,用逗号分割。这样可以省略像-debug-这样的参数。下面是一个设置ANDROID_VERBOSE的例子,它带有-debug-init和 -debug-modem 参数:
ANDROID_VERBOSE=initmodem更多信息参见.
Media
-audio 使用指定的音频后端。
-audio-in 使用指定的音频输入后端。
-audio-out 使用指定的音频输出后端。
-noaudio在当前虚拟机实例中关闭音频支持。
-radio 重新定向收音机接口到本地的字节设备。
-useaudio打开模拟器实例的音频支持。默认为打开。
Network
-dns-server 使用指定的DNS服务器。必须是以逗号分割,多于4个的服务器名或IP地址。
-http-proxy 配置TCP连接使用HTTP/HTTPS代理。
必须符合以下格式:http://:
http://:@: 前缀http://可以被忽略。如果-http-proxy 未被指定,模拟器将寻找http_proxy环境变量,并且自动寻找所有符号格式要求的 值。
-netdelay 设置网络延迟默认值为none。参见Network Delay Emulation中关于的值。
-netfast快捷的 -netspeed full -netdelay none
-netspeed 指定模拟器网络速度为.默认值为full。参见表格Network Speed Emulation 中的值。
-port 指定模拟器网络端口为.控制台端口号必须介于5554和5584之间,并且+1必须留作ADB使用。
-report-console 启动前向第三方同志此模拟器实例的网络端口。 必须是以下几种格式
tcp:[server][max=]
unix:[server][max=]
更多信息参见 -help-report-console
System
-cpu-delay 降低模拟器CPU的速度到。支持0到100的整数。注意与具体的时钟或其他的绝对频率无关。它只表现为一种抽象的,相对于当前模拟器运行状况的速度调节。
-gps 重定向NMEA GPS到字节设备。
使用此参数通知模拟器模拟一个NMEA-compatible GPS,连接到一个扩展的设备或socket端口。格式必须符合QEMU-specific所指定的设备格式。更多信息参见’serial -dev’ 和 http://www.bellard.org/qemu/qemu-doc.html#SEC10.
-nojni在Dalvik运行时关闭JNI检查
-qemu传递参数到qemu。
-qemu -h关闭qemu帮助。
-radio 重定向录音机模块到制定的字符设备。格式必须符合QEMU规定的序列设备。详情参见http://www.bellard.org/qemu/qemu-doc.html#SEC10.
-timezone 设定模拟器时区为,替换为系统时区。必须按照时区格式指定。比如:”America/Los_Angeles”,”Europe/Paris”
-version显示模拟器版本号。
UI
-dpi-device 修改模拟器的分辨率适配物理设备。默认值为165。参见-scale.
-no-boot-anim关闭模拟器启动时的动画。禁用启动动画可以加快启动速度。
-no-window关闭模拟器的绘制窗口。
-scale 调整模拟器窗口。 是介于0.1到3的数字,它是调整屏幕的比例因子。您也可以指定一个DPI值,在添加dpi前缀的情况下。Auto参数告诉模拟器选择自己最合适的尺寸。
-raw-keys关闭Unicode键盘reverse-mapping.
-noskin不使用任何模拟器皮肤。
-keyset 用指定的键盘设置文件代替默认。指定宿主键盘和模拟器之间的键盘映射文件。更多信息参见-help-keyset。
-onion 用图片覆盖屏幕。不支持JPEG,只支持PNG
-onion-alpha 指定onion皮肤透明值(百分比) 默认为50.
-onion-rotation 指定onion皮肤旋转。 必须是 0 1 2 3中的一个。
-skin 启动模拟器,搭配指定皮肤。
-skindir 在指定目录下搜索皮肤

⑶ linux和android的区别

虽然Android基于Linux内核,但是它与Linux之间还是有很大的差别,比如Android在Linux内核的基础上添加了自己所特有的驱动程序。下面我们就来分析一下它们之间究竟有什么关系?
android是否能称为一种新的操作系统呢?至少我自己认为不算是,它最多算作一个新的应用程序罢了。
一、Android为什么会选择Linux
成熟的操作系统有很多,但是Android为什么选择采用Linux内核呢?这就与Linux的一些特性有关了,比如:
1、强大的内存管理和进程管理方案
2、基于权限的安全模式
3、支持共享库
4、经过认证的驱动模型
5、Linux本身就是开源项目
更多关于上述特性的信息可以参考Linux 2.6版内核的官方文档,这便于我们在后面的学习中更好地理解Android所特有的功能特性。接下来分析Android与Linux的关系。
二、Android不是Linux
看到这个标题大家可能会有些迷惑,前面不是一直说Android是基于Linux内核的吗,怎么现在又不是Linux了?迷惑也是正常的,请先看下面几个要点,然后我们将对每一个要点进行分析,看完后你就会觉得Android不是Linux了。
因为它没有本地窗口系统,没有glibc的支持,而且并不包括一整套标准的Linux使用程序,同时增强了Linux以支持其特有的驱动。
1.它没有本地窗口系统
什么是本地窗口系统呢?本地窗口系统是指GNU/Linux上的X窗口系统,或者Mac OX X的Quartz等。不同的操作系统的窗口系统可能不一样,Android并没有使用(也不需要使用)Linux的X窗口系统,这是Android不是Linux的一个基本原因。
我很奇怪的是linux的Xwindow并不是其核心程序,你可以看到很多嵌入式linux根本不会用到这个图形界面系统,而手机上的android不使用Xwindow不是很正常吗?我们学习的时候用QT难道就不叫做linux系统了么?
2.它没有glibc支持
由于Android最初用于一些便携的移动设备上,所以,可能出于效率等方面的考虑,Android并没有采用glibc作为C库,而是Google自己开发了一套Bionic Libc来代替glibc。
库文件不同,好吧,因为移植显然是要修改库文件和头文件的吧,求指教
3.它并不包括一整套标准的Linux使用程序
Android并没有完全照搬Liunx系统的内核,除了修正部分Liunx的Bug之外,还增加了不少内容,比如:它基于ARM构架增加的Gold-Fish平台,以及yaffs2 FLASH文件系统等。

4.Android专有的驱动程序
除了上面这些不同点之外,Android还对Linux设备驱动进行了增强,主要如下所示。
1)Android Binder 基于OpenBinder框架的一个驱动,用于提供 Android平台的进程间通信(InterProcess Communication,IPC)功能。源代码位于drivers/staging/android/binder.c。
2)Android电源管理(PM) 一个基于标准Linux电源管理系统的轻量级Android电源管理驱动,针对嵌入式设备做了很多优化。源代码位于:
kernel/power/earlysuspend.c
kernel/power/consoleearlysuspend.c
kernel/power/fbearlysuspend.c
kernel/power/wakelock.c
kernel/power/userwakelock.c
如果给内核添加驱动也可以称之为不同的话?
3)低内存管理器(Low Memory Killer) 比Linux的标准的OOM(Out Of Memory)机制更加灵活,它可以根据需要杀死进程以释放需要的内存。源代码位于 drivers/staging/ android/lowmemorykiller.c。
4)匿名共享内存(Ashmem) 为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。源代码位于mm/ashmem.c。
5)Android PMEM(Physical) PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。源代码位于drivers/misc/pmem.c。
6)Android Logger 一个轻量级的日志设备,用于抓取Android系统的各种日志。源代码位于drivers/staging/android/logger.c。
7)Android Alarm 提供了一个定时器,用于把设备从睡眠状态唤醒,同时它还提供了一个即使在设备睡眠时也会运行的时钟基准。源代码位于drivers/rtc/alarm.c。
8)USB Gadget驱动 一个基于标准 Linux USB gadget驱动框架的设备驱动,Android的USB驱动是基于gaeget框架的。源代码位于drivers/usb/gadget/。
9)Android Ram Console 为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备里,它是一个基于RAM的Buffer。源代码位于drivers/staging/android / ram_console.c。
10)Android timed device 提供了对设备进行定时控制的功能,目前支持vibrator和LED设备。源代码位于drivers/staging/android /timed_output.c(timed_gpio.c)。
11)Yaffs2 文件系统 Android采用Yaffs2作为MTD nand flash文件系统,源代码位于fs/yaffs2/目录下。Yaffs2是一个快速稳定的应用于NAND和NOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,Yaffs2能使用更小的内存来保存其运行状态,因此它占用内存小。Yaffs2的垃圾回收非常简单而且快速,因此能表现出更好的性能。Yaffs2在大容量的NAND Flash上的性能表现尤为突出,非常适合大容量的Flash存储。

⑷ android webcam模块

一键烧写本质上是启动位于SD卡中的Uboot,通过uboot读取sd卡中的文件到SRAM最后通过nand指令实现一键烧写,这一块可以参考提供的uboot源码中include\configs 中的smdk6410.h 的529行,代码如下:

代码1:

复制代码
#elif defined(FORLINX_BOOT_SD)
#define FORLINX_DEBUG
#define CONFIG_MMC 1
#define CONFIG_LCD
#define CONFIG_BOOT_MOVINAND
#define CFG_ENV_IS_IN_MOVINAND

#define CONFIG_BOOTCOMMAND "nand led-start;nand erase ;fatload mmc 0:1 0x50008000 u-boot.bin;nand write.uboot 0x50008000 0 0x200000;fatload mmc 0:1 0x50008000 zImage;nand write.e 0x50008000 0x200000 0x500000; fatload mmc 0:1 0x50008000 rootfs.yaffs2; nand write.yaffs2 0x50008000 0x00700000 $filesize; nand beep; nand led-end"
复制代码
从这段代码代码可以看出,uboot中通过宏定义的方式,当定义为FORLINX_BOOT_SD 式通过对相应配置相应的环境变量完成特定的操作,其中定义CONFIG_BOOTCOMMAND 后就可以自动进行nand的查处,从sd卡加载uboot等,这段代码内容稍后继续分析。

下面说一下tftp和地址相关的知识总结

tftp是指通过tftp协议通过网络的方式进行文件传输,需要说明的是ok6410的出厂uboot是不支持网络的,这也就意味着nfs根文件系统以及通过tftp下载内核等都无法操作,其实解决这个问题也很简单,只需要替换网卡相关的文件就可以了,改动不是很大,这个可以找到很多资料,这里不再赘述。不过飞凌在12年9月的更新光盘中已经做了更新,uboot已经支持网络操作了,查一下源码也就是改了那几个文件,因此可以下载烧写最新版uboot。

在进行tftp的操作时最开始可能容易搞混的就是烧写内核啥的应该烧写到哪一个地址去,最开始也有点混,比如有人的博客里是tftp c0008000 zImage 这个地址是c0008000,国嵌的视频教程中是c0800000,各不相同,没看到具体的叙述,而在通过usb等方式中通过usb传送的地址是50008000,因此可能会存在混乱,因此觉得有必要在博客中总结一下。关于地址空间的分配首先还需要看一下芯片手册。芯片手册中关于地址空间的安排如图所示。

image

有一点需要说明的是,图中的地址空间是针对通过地址总线与数据总线进行操作的设备的,通过不同的片选信号来确定对应的地址,所以可以通过图中查表可以确定ok6410的256M RAM的地址范围为0x50000000-0x5FFFFFFF 256M的地址空间,因此通过tftp下载到0x50008000也就是加载到RAM中(向后偏移了32K的地址,稍后在介绍)。到这儿对于0x50008000这个地址的由来就初步了解了。

再来看看很多资料中都提到的0xc0008000这个地址,smdk6410.h这个文件的501行可以找到这部分配置:

代码2

复制代码
//uboot-2M ,zImage-5M ,FS-200M,user-other
#define CFG_NAND_ERASE_LEN 0xCF00000 //200MB

#if defined(FORLINX_BOOT_NAND)
#define CONFIG_BOOT_NAND
#define CFG_ENV_IS_IN_NAND
//#define CFG_NAND_LARGEPAGE_SAVEENV
//#define CFG_NAND_FLASH_BBT
#define CONFIG_BOOTCOMMAND "nand read 0xc0008000 0x200000 0x500000;bootm 0xc0008000"
复制代码
这部分定义了nand flash的地址空间划分和启动的地址:bootm 0xc0008000,也就是说是从内存中的这个地址启动内核的,但问题是在上图的地址划分中地址最大值也只到0x6FFFFFFF,0xc0008000这个地址是什么地方呢?一样从源码入手,继续找!

同样从smdk6410.h这个文件的452行可以找到这部分配置。

代码3

复制代码
/* base address for uboot */
#ifdef CONFIG_ENABLE_MMU
#define CFG_UBOOT_BASE TEXT_BASE
#define CFG_PHY_UBOOT_BASE (MEMORY_BASE_ADDRESS + (TEXT_BASE - 0xC0000000))
#else
#define CFG_UBOOT_BASE TEXT_BASE
#define CFG_PHY_UBOOT_BASE TEXT_BASE
#endif
复制代码
看了这段代码就明白了,在使能了MMU之后,这段代码相当于对地址做了一个重映射,经过(MEMORY_BASE_ADDRESS + (TEXT_BASE - 0xC0000000))计算后,因为MEMORY_BASE_ADDRESS 为0x50000000(可以在文件开始找到定义)所以经过这样的一个计算,0xc0008000就是0x5000c000。而0xc0008000是内核启动的起始虚拟地址,因此需要做这样的一个映射来和内核对应。

到这儿可能很多人和我当初有一样的疑惑,那就是如果tftp烧写文件系统应该烧写到哪一个地址去呢?在回到上面的地址图表,在最开始我就说过,这个表是针对使用地址总线与数据总线操作的设备而言,因此对于NOR flash、SRAM、DRAM等都是可以直接寻址读写的,而对于Nand Flash,可以参考下电路图,使用的是8个IO进行操作,右Nand控制器弯沉相关的操作,因此是没有一个绝对的地址的。需哟啊注意图表中的黄色框部分,One Nand并不是普通Nand Flash,区别就在于这种Nand是和NOR、SRAM一样的通过地址总线、数据总线进行操作的方式,因此它是有地址的,对于板子所用的Nand Flash来说只有偏移地址,没有绝对地址。

到这里,对于tftp下载内核、文件系统的相关操作应该清楚了,具体地址其实看看uboot源码就清楚了,可以参考代码1中的这部分:

#define CONFIG_BOOTCOMMAND "nand led-start;nand erase ;fatload mmc 0:1 0x50008000 u-boot.bin;nand write.uboot 0x50008000 0 0x200000;fatload mmc 0:1 0x50008000 zImage;nand write.e 0x50008000 0x200000 0x500000; fatload mmc 0:1 0x50008000 rootfs.yaffs2; nand write.yaffs2 0x50008000 0x00700000 $filesize; nand beep; nand led-end"
如果通过sd卡启动时跳过自动操作进入手动选择操作的话就应该有印象,可以单独选择烧写某一个文件,例如单独烧写文件系统,操作如下图所示:

SNAGHTML1ac3bff

那么通过找到对应的命令源码也是可以的,源码位于common/mian.c 343行:

复制代码
void arm_USBfuse(void)
{
unsigned char select;
while(1)
{
printf("\n##### Select the fuction #####\n");
printf("[1] Flash u-boot\n");
printf("[2] Flash kernel\n");
printf("[3] Flash system\n");
printf("[4] Exit\n");
printf("Enter your Selection:");

select = getc();
printf("%c\n", select >= ' ' && select <= 127 ? select : ' ');
void arm_sdfuse(void)
{
unsigned char select;
while(1)
{
printf("\n##### flash from SDcard #####\n");
printf("\n##### Select the fuction #####\n");
printf("[1] Flash all image\n");
printf("[2] Flash u-boot\n");
printf("[3] Flash kernel\n");
printf("[4] Flash system\n");
printf("[5] Exit\n");
printf("Enter your Selection:");

select = getc();
printf("%c\n", select >= ' ' && select <= 127 ? select : ' ');

switch(select)
{
case '1':
ExecuteCmd("nand erase");
ExecuteCmd("fatload mmc 0:1 50008000 u-boot.bin");
ExecuteCmd("nand write.uboot 50008000 0 200000");
ExecuteCmd("fatload mmc 0:1 50008000 zImage");
ExecuteCmd("nand write.e 50008000 200000 500000");
ExecuteCmd("fatload mmc 0:1 50008000 rootfs.yaffs2");
ExecuteCmd("nand write.yaffs2 50008000 700000 $filesize");
break;

case '2':
ExecuteCmd("nand erase 0 200000");
ExecuteCmd("fatload mmc 0:1 50008000 u-boot.bin");
ExecuteCmd("nand write.uboot 50008000 0 200000");
break;

case '3':
ExecuteCmd("nand erase 200000 500000");
ExecuteCmd("fatload mmc 0:1 50008000 zImage");
ExecuteCmd("nand write.e 50008000 200000 500000");
break;

case '4':
ExecuteCmd("nand erase 700000");
ExecuteCmd("fatload mmc 0:1 50008000 rootfs.yaffs2");
ExecuteCmd("nand write.yaffs2 50008000 700000 $filesize");
break;
case '5':
return;
default:
break;
}
}
}
复制代码
通过tftp单独烧写内核或者文件系统时只需要参考一键烧写的命令烧写到对应的nand 偏移地址即可。

⑸ 开发板怎么烧android系统

首先是友善之臂的Mini6410,它提供了两种Boot,一种是移植的三星提供U-Boot1.1.6,这个版本不支持UBI文件系统的烧写,他们自己做了个superboot,支持UBI,但是不开源,没用过。

然后就是飞凌的OK6410,他们使用的也是三星提供的U-Boot,不支持UBI。所以想出另外的方式来烧写。他们的烧写使用了自己的 SD卡烧写工具:SD_Writer,首先烧写了一个mmc.bin和一个zImage-sd的文件到SD卡中,前者mmc.bin其实就是用于SD卡启动的,后者zImage-sd是一个内核文件。我们首先来看看mmc.bin做了哪些事情,从SD卡启动,进入U-Boot的下载模式,使用printenv打印环境变量,可得:

SMDK6410 # printenv
bootargs=rootdelay=0 console=ttySAC0,115200
bootcmd=nand erase;
fatload mmc 0:1 0x50008000 u-boot.bin;nand write.uboot 0x50008000 0 0x100000;
fatload mmc 0:1 0x50008000 zImage;nand write.e 0x50008000 0x100000 0x500000;
movi read kernel 0x50008000;bootm 0x50008000
从上面得bootcmd可以知道做的事情分四步:
1、擦除整个NAND Flash;

2、从SD卡中将u-boot.bin文件下载到内存中,然后烧写到NAND Flash上;

3、从SD卡中将zImage下载到内存中,然后烧写到NAND Flash上;

4、从SD卡读取内核(不是上一步烧写的zImage,而是之前使用SD卡烧写工具烧写的zImage-sd)到内存,然后启动这个内核。而启动参数就是上面的bootargs所显示。

进入这个内核之后,就会进入下面这个命令行,

可能有人会觉得之前烧写了U-Boot和zImage-sd到SD卡上,并没有烧写文件系统,那这个内核怎么启动呢?这里我们看一下命令提示符前面“initramfs”这几个字符就明白了。

所有的2.6版本linux内核都有一个特殊的文件系统rootfs,是内核启动的初始始根文件系统,initramfs的文件会复制到rootfs。如 果把initramfs比作种子,那么rootfs就是它生长的土壤。大部分linux系统正常运行后都会安装另外的文件系统,然后忽略rootfs。

这下大家就知道了吧,但是由于飞凌没提供的源文件,所以不知道yjsx这个程序具体是啥,只能通过看烧写的过程知道了,这里我就不贴了。主要做的工作就是把拷贝到SD卡中的文件系统烧写到NAND Flash上,注意,这里他们烧写的是yaffs格式,而不是ubi,我猜想他们仅仅是为了方便用户使用SD卡烧写(毕竟友善之臂的烧写方式确实非常好),而不是使用ubi文件系统。

这里再来说一些Real6410和TQ6410,他们做法类似,Real6410是在NAND分区的时候分了两个文件系统区,一个是cramfs,一个是真正用到的文件系统区。先启动内核进入cramfs文件系统,将NAND格式化为UBI格式的,再进行烧写。同样,TQ6410也是先挂载NFS文件系统,将NAND格式化UBI,然后进行烧写。

不过貌似TQ6410V2已经支持了UBI烧写,这个还没看。

⑹ android 怎么看nand flash 大小

1. 查看当前系统的分区情况
$ adb shell
$ cat /proc/mtd
2. 分区对应的img(源码编译后生成在out/target/proct/xxx/目录下)
a) modem(多个,支持电话和GPS)
amss.mbn
b) bootloader(启动用)
appsboot.mbn
c) 空中升级
fota*(升级用, 可能多个)
d) 内核和文件系统
boot.img(内核和基本文件系统)
e) 系统分区
system.img(系统分区)
f) 用户数据分区
userdata.img(数据分区)
3. 参考

⑺ android手机EMMC是什么硬盘分区

android手机eMMC=NAND Flash+闪存控制芯片+标准接口封装
就是在原有内置存储器的基础上,又额外加了一个控制芯片,最后再以统一的方式封装,并预留一个标准接口,以便手机客户拿来直接使用。这有点类似于联发科的MTK,或者是高通的Snapdragon解决方案,手机终端厂商买的不只是一颗CPU,而是一整套方案。如此一来,操作简化了不少,还避免了不同厂牌硬件之间的兼容性问题。上述3款产品之所以能够在SD卡读取一项中脱颖而出,靠的就是eMMC,当然使用eMMC内置存储的不止这三家,近期给笔者留下比较深印象的、移动首款Android4.0双核智能机--中兴U970也属于eMMC阵营的产品。
1、 手机的内置存储读取速度提升,到来的直接好处就是手机执行效率的提升。无论是播放音乐视频,还是浏览网页,以及最耗硬件资源的玩游戏,在处理器、RAM之外,所谓的ROM读取速度也是相当重要的一项指标。
2、MMC协会董事会成员包括:ATP、华硕、Gemplus、惠普、英飞凌、Intel、Itri、Kingston、Lexar媒体公司、Micron科技、诺基亚、Power Digital Card、三星电子、Silicon Motion。在最新的eMMC4.5之后,eMMC新规格将由三星电子的UFS(Universal Flash Storage)主导,未来甚至还会把RAM封装打包,三星在这方面罕有敌手。
3、

⑻ 关于安卓跟LINUX的关系~

Android 和 MOTO V8 的系统完全是两个概念。
现在各个手机网站的编辑大脑都是严重萎缩的,根本就不能理解 Linux 是什么。

Linux 仅仅是内核,根本就不是一个完整的操作系统。
一个完整的操作系统,包括内核,功能库,用户界面三个主要部分。一个应用程序,主要运行的并不是依靠内核来运行,它主要是借助功能库提供程序功能函数支持,用户界面层提供显示和交互的功能函数支持,内核只是一个硬件驱动交互,任务分配,内存管理,IO 处理的最底层的支持。

也就是说,一个程序能不能运行,主要是看函数库和用户界面的支持情况。
但很明显的,Android 和 MOTO V8 完全是两种实现方法,根本就不能拿来做比较。
Android 是基于叫做 Dalvik 的 java 虚拟机而运行的一个上层系统,所有的 Android 程序其实都是 java 程序,直接运行在这个 java 虚拟机里面,Android 的程序根本就不是一个真实的二进制程序。
MOTO V8 我要没记错,是基于QT 嵌入式开发的一个系统,叫做 EZX Linux 。QT 提供了一个完整的函数库和用户界面支持库。他的程序理论上都是手机上面可以运行的本地二进制程序(记得是 ARMv5 的)。但实际上,MOTO 不允许二进制程序的开发和安装,只能用 java 程序,也就是 j2me 的程序。

虽然两个都是虚拟机,但这两个虚拟机本质完全不同。
Dalvik 的虚拟机是针对 Android 手机的基本要求,也就是要有一个触摸屏,4个物理按键,内存和 CPU 性能都要求很高的硬件进行设计的。j2me 是针对的手机就没有这个要求。不同的 j2me 手机和程序,都有不同的功能和性能。

可以说,Andorid 系统和 MOTO V8 的 EZX ,就算都用 Linux 内核,Linux 内核提供的硬件支持,功能支持等等的东西,在手机这种针对性极强的硬件上,也会出现不同的兼容问题。
他们两个除了都是基于 Linux 内核这个称呼以外,其余的他们根本就完全不同。

Linux 从来就没有说过“二进制兼容”,Linux 遵循 POSIX 标准,Linux 之间还有一个 LSB 兼容标准,但这个不是强制标准,而且在手机上根本就没办法执行的。

⑼ 买了一台安卓系统的车载导航一体机,看资料上说是DDR 1G和nand flash 8g,感觉内存还

运行的内存说是有1G,但毕竟系统肯定要消耗掉一部分的,8G的储存,除去车机自带的应用软件,还剩5.6G也很正常的

阅读全文

与androidnandflash相关的资料

热点内容
程序员那么可爱陆漓和姜逸城吻戏 浏览:802
android获取窗口大小 浏览:180
程序员为世界带来的贡献 浏览:214
程序员招聘自荐信 浏览:693
魔兽键位设置命令宏 浏览:645
程序员没有目标了 浏览:828
抢答器c程序编程 浏览:703
什么app可以自己玩 浏览:76
刨客app是什么 浏览:963
cad输入命令栏不见了 浏览:834
做故事集可以用什么app 浏览:692
qq邮箱发送压缩包 浏览:672
程序员桌面机器人 浏览:589
xjr快速开发平台源码 浏览:159
java接口runnable 浏览:31
python怎么运行web服务器 浏览:349
notepad编程代码 浏览:740
什么安卓的毛病最少 浏览:611
hp的pjl设备访问命令 浏览:635
googlewebp图片压缩技术 浏览:215