基于全志A20 android4.2平台如何支持三个SD卡

基于全志A20 android4.2平台如何支持三个SD卡

 

         做过android平台的同仁大多都知道android原生态只支持了一个sd卡,默认的挂载点也就是/mnt/sdcard,所以在应用中使用getExternalStorageDirectory()得到的都是/mnt/sdcard,通常会symlink
到/sdcard目录。做过全志平台的童鞋也知道全志android SDK支持2个sd卡,通常是一个内置的,一个外置的,内置的一般是从nand上或者emmc上的用户数据区,因为现在的nand、emmc容量都比较大,存放android程序、cache、backup、download等之外,还有大量的空间剩余,因此这部分大多都会做成一个sd卡来使用,通常挂载到/mnt/sdcard上;外置的是挂载在/mnt/extsd节点上。但是,如何在全志平台上使用三个sd卡呢?即再增加一个外置的SD卡支持。

      为了多支持一个SD卡,我们有以下基本需要做:

      1、         
在系统配置文件里,打开对应的SD卡驱动支持,设置好检测方式,如果是gpio方式的要配置好gpio引脚;笔者测试过,如果两个外置的SD卡,都使用gpio
polling的方式,系统只识别一个SD卡,笔者把两个SD卡一个配置成gpio polling,另外一个配置成了GPIO IRQ中断模式;

[mmc0_para]
sdc_used            = 1
sdc_detmode         = 2
sdc_buswidth        = 4
sdc_clk             = port:PF02<2><1><2><default>
sdc_cmd             = port:PF03<2><1><2><default>
sdc_d0              = port:PF01<2><1><2><default>
sdc_d1              = port:PF00<2><1><2><default>
sdc_d2              = port:PF05<2><1><2><default>
sdc_d3              = port:PF04<2><1><2><default>
sdc_det             = port:PH3<6><1><default><default>
sdc_use_wp          = 0
sdc_wp              =
sdc_isio            = 0
sdc_regulator       = "none"

[mmc1_para]
sdc_used            = 1
sdc_detmode         = 1
sdc_buswidth        = 4
sdc_clk             = port:PH23<5><1><2><default>
sdc_cmd             = port:PH22<5><1><2><default>
sdc_d0                   = port:PH24<5><1><2><default>
sdc_d1                   = port:PH25<5><1><2><default>
sdc_d2                   = port:PH26<5><1><2><default>
sdc_d3                   = port:PH27<5><1><2><default>
sdc_det                  = port:PH2<0><1><default><default>
sdc_use_wp          = 0
sdc_wp              =
sdc_isio            = 0
sdc_regulator       = "none"

     2、         
在vold.fstab里,需要修改一下,如下:

## Vold 2.0 fstab for HTC Passion
#
## - San Mehat (san@android.com)
##
#######################
## Regular device mount
##
## Format: dev_mount <label> <mount_point> <part> <sysfs_path1...>
## label        - Label for the volume
## mount_point  - Where the volume will be mounted
## part         - Partition # (1 based), or 'auto' for first usable partition.
## <sysfs_path> - List of sysfs paths to source devices
######################

# Mounts the first usable partition of the specified device
#/devices/platform/awsmc.3/mmc_host for sdio
dev_mount	sdcard	/mnt/sdcard	auto	/devices/virtual/block/nandk	/devices/platform/sunxi-mmc.2/mmc_host
dev_mount	extsd	/mnt/extsd	auto	/devices/platform/sunxi-mmc.1/mmc_host
dev_mount	extsd2	/mnt/extsd2	auto	/devices/platform/sunxi-mmc.0/mmc_host
dev_mount	usbhost1	/mnt/usbhost1	auto	/devices/platform/sw-ehci.1	/devices/platform/sw_hcd_host0	/devices/platform/sw-ohci.1

这三个SD卡挂载点都是可以随便交换的;

3、         
如果完成了上面两步,extsd2对应的SD卡热插拔是可以自动挂载,如果是开机启动前就在sd卡槽里面的话,就不会自动识别,因此我们得明确告诉系统storage配置,配置在storage_list.xml文件中,如下:

         <storage android:mountPoint="/mnt/extsd"

             android:storageDescription="extsd"

             android:primary="false"

             android:removable="true"

             android:emulated="false"  

             android:mtpReserve="0" 

             android:allowMassStorage="true"

             android:maxFileSize="0"/>
 

4、         
在system/vold下面做一些处理,类似extsd处理,加上即可,如下:

diff --git a/DirectVolume.cpp b/DirectVolume.cpp
index 16ac2d8..43ce612 100755
--- a/DirectVolume.cpp
+++ b/DirectVolume.cpp
@@ -346,7 +346,7 @@ void DirectVolume::handlePartitionRemoved(const char *devpath, NetlinkEvent *evt
          * Yikes, our mounted partition is going away!
          */

-        if(!strstr(getLabel(),"usb")&&!strstr(getLabel(),"extsd")){
+        if(!strstr(getLabel(),"usb")&&!strstr(getLabel(),"extsd")&&!strstr(getLabel(),"extsd2")){
         snprintf(msg, sizeof(msg), "Volume %s %s bad removal (%d:%d)",
                  getLabel(), getMountpoint(), major, minor);
         mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeBadRemoval,
diff --git a/Volume.cpp b/Volume.cpp
old mode 100644
new mode 100755
index 23556ea..a1f059a
--- a/Volume.cpp
+++ b/Volume.cpp
@@ -864,7 +864,7 @@ int Volume::unmountVol(bool force, bool revert) {
     setState(Volume::State_Unmounting);
     usleep(1000 * 1000); // Give the framework some time to react

-    if(getMountpoint()!=NULL&&!strstr(getMountpoint(),"usb")&&!strstr(getMountpoint(),"extsd")){
+    if(getMountpoint()!=NULL&&!strstr(getMountpoint(),"usb")&&!strstr(getMountpoint(),"extsd")&&!strstr(getMountpoint(),"extsd2")){
         /*
          * Remove the bindmount we were using to keep a reference to
          * the previously obscured directory.

 

     完成了以上几步,三个SD卡已经可以自动识别挂载了,mount的信息如下:

root@android:/ # mount

rootfs / rootfs rw 0 0
tmpfs /dev tmpfs rw,nosuid,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
tmpfs /mnt/secure tmpfs rw,relatime,mode=700 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/nandd /system ext4 rw,nodev,noatime,nobarrier,data=ordered 0 0
/dev/block/nande /data ext4 rw,nosuid,nodev,noatime,journal_checksum,nobarrier,noauto_da_alloc,data=ordered 0 0
/dev/block/nandh /cache ext4 rw,nosuid,nodev,noatime,journal_checksum,nobarrier,noauto_da_alloc,data=ordered 0 0
/dev/block/vold/179:16 /mnt/extsd vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1023,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/vold/179:0 /mnt/extsd2 vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1023,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/vold/93:80 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/vold/93:80 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 0
tmpfs /mnt/sdcard/.android_secure tmpfs ro,relatime,size=0k,mode=000 0 0
root@android:/ # 

 

时间: 2024-12-21 07:12:27

基于全志A20 android4.2平台如何支持三个SD卡的相关文章

三星Galaxy S6是否支持插入外置SD卡?(G9200)

  Galaxy S6配置32GB内置硬盘,可以满足用户需求,因此没有配置SD卡插口.如果您需要将旧Galaxy设备中的数据传输到新的Galaxy S6,通过Smart Switch软件可以很便捷地将旧设备中现存的(包括SD卡中的数据)传输到S6的内置硬盘.在使用S6的时候,若您需要释放设备存储空间,可以将可移动文件如照片等通过PC进行备份,连接PC时设备连接方式设置为"媒体设备(MTP)",或者使用Smart Switch PC版进行备份(可以通过www.samsung.com/sm

基于开源软件在Azure平台建立大规模系统的最佳实践

前言 Microsoft Azure 是微软公有云的唯一解决方案.借助这一平台,用户可以以多种方式部署和发布自己的应用. 这是一个开放的平台,除了对于Windows服务器和SQL Server的支持,Microsoft Azure也支持了大量主流开源软件和框架,包括Linux, Tomcat, Java等.如何将一个基于开源软件的系统迁移到Microsoft Azure平台,并充分发挥云在弹性.敏捷性等方面的优势? 本文和读者分享一些最佳实践经验,并在文末以中国网络电视台的系统迁移作为参考案例.

Sculpture:基于MDD的集成开发平台

Sculpture是一个基于模型驱动的集成开发平台,目前已经发布了2.1版本. 相信大家对模型驱动,领域设计这些概念已经并不陌生,模型驱动能够极大的提高开发效率,当然这也和项目的类型有关,有所为有所不为,一定要因地制宜. 对于开发系统产品来说,一般是分三个方向: 1.一种是开发出一个功能全面的产品,功能可配置化,客户根据自己的需求进行功能的配置.如SAP 2.另外一种是根据客户的需求直接在平台上进行二次开发,开发完再提交给客户. 如U9 ,EasyBridge.Net 3.还有一种就是拿一个案例

基于php的微信公众平台开发入门实例_php实例

本文实例讲述了基于php的微信公众平台开发方法.分享给大家供大家参考.具体如下: 最近在做微信公众平台开发,一口气写了二十几个功能,挺有意思的- 今天来分享一下开发经验~ 微信公众平台提供的接口很简单,先看看消息交互流程: 说的通俗一些,用户使用微信发送消息 -> 微信将数据发送给开发者 -> 开发者处理消息并返回数据至微信 -> 微信把返回数据发送给用户,期间数据交互通过XML完成,就这么简单.   下面写个实例,开发微信智能聊天机器人:  1. 注册微信公众平台账号 微信公众平台:

基于Bluemix的微信公共平台应用开发

而微信公共平台的账号已经达到了 200 多万,因此如果能利用 Bluemix 开发微信公共平台应用,笔者 认为将为广大的微信开发者学习.部署.测试.直至形成商业应用带来福音, 所以笔者通过研究,成功完成了基于 Bluemix 的微信公共平台应用开发,在此做一些简要的介绍,以便于微信公共开发者推进深化应用. 基本过程 在开发微信公众平台前,需要申请一个微信公共账号,此处不做赘述,笔者使用的微信公共账号名称为:"正海说知识创新",代号为:"zhszscx".如何申请微信

OpenShift 3 : 基于Docker的私有PaaS平台

本文讲的是OpenShift 3 : 基于Docker的私有PaaS平台,[编者的话]OpenShift是一个非常有前途的私用PaaS解决方案,它可以减少从项目开始到自动构建应用和部署的时间,它支持绝大多数的Web架构,将成为基于Docker的私有PaaS平台领域的参照. OpenShift是一个私有的PaaS(Platform-as-a-Service)解决方案,主要用来在容器中搭建.部署以及运行应用程序.它是基于Apache 2.0许可的开源软件, 并且发行了两个版本, 一个是社区版, 一个

基于Docker开发的PaaS平台 DINP

基于Docker开发的PaaS平台 DINP DINP是又一个基于Docker开发的PaaS平台. DINP 包含如下组件: dinp-server master组件,控制集群中所有计算节点 dinp-agent Agent,部署在所有计算节点,收集各个节点运行状态和container列表 dinp-builder 编配平台,负责把用户代码打包为Docker image dinp-dash Dashboard,用户操作的入口 dinp-router 负责请求的路由等功能 dinp-hm Heal

基于ArcGIS的JLKEngine中间件平台可带框架源码购买并提供免费升级服务!

问题描述 基于ArcGIS的JLKEngine中间件平台底层类库结构简介1,系统总体上划分为如下几个层次:JLKEngine核心库:它是JLKEnigne的运行基础,定义了框架运行模型.框架扩展模式.并对ArcGISEngine中可用的操作进行了封装,提供了一组函数实现对空间数据的快速处理,以便于在基于ArcGISEngine的应用系统开发中应用以简化开发工作难度.GIS基础功能库:它是在ArcGISEngine基础上按地图制图.数据编辑.网络分析.三维分析等对数据处理划分的一组类库.在这组

企业为什么要使用基于Docker的PaaS/CaaS平台

作者:精灵云 前言 早在十多年前国内外的一些大厂就开始投入研发和使用容器技术,比如Google,对他们来说,使用容器能够充分利用计算资源节省硬件成本.而这几年--众所周知--真正把容器技术发扬光大的是Docker.Docker的slogan"Build,Ship & Run anywhere"定位非常清晰,Docker的出现打破了传统运维模式里从打包到部署的过程中环境.语言.平台不一致的乱象,将这一整套开发运维模式标准化了,从而真正帮助企业实践了DevOps和微服务化. 但是,