双内置SD卡的实现

来源:互联网 发布:淘宝买家注册要求 编辑:程序博客网 时间:2024/05/04 02:03

客户需求:

在内置FLASH内划分一个单独的小空间用来存放客户软件,通过USB连接时此区域在PC上可见。

OS: android4.4

硬件平台: MT8389

设计分析:

内置SD卡及模拟光盘都可实现客户的需求,但模拟光盘的工作量较大,涉及到镜像文件制作,通过USB块设备方式读出数据等。内置SD卡有两种实现方式,Shared SDcard方案及FAT on Nand方案。Shared SDcard方案,MTP/UMS方式在PC端看不到内置sd卡,故排除该方案,另外,该平台已经使用FAT on Nand方案,即单独划分一个FAT区域用作SD卡。综合考虑,在不改动系统当前的设计的情况下,再增加一个内置SD卡来实现客户的需求。

 

实现:

1. 在下面xls表中增加一个fat分区custom

   mediatek/build/tools/ptgen/MT6589/partition_table_MT6589.xls

 

2. 增加一个lun,

   kernel/drivers/usb/gadget/android.c

 

3. 采用将客户软件打包进userdata镜像文件,系统第一次启动时将userdata分区的文件拷贝至custom分区。

   (1). 在工程中增加下列文件夹,并将客户软件拷贝到该目录下,

   vendor/mediatek/project/artifacts/out/target/product/project/data/custom

   (2). 增加custom.sh文件,该脚本的调用见第4点。

   mkdir -p /data/custom_tmp

   mount -t vfat /dev/block/vold/179:8 /data/custom_tmp

   if [ ! -f "/data/custom_tmp/test.txt" ]; then

   cp /data/custom/test.txt /data/custom_tmp

   fi

   echo "1" > /sys/devices/platform/mt_usb/musb-hdrc.0/gadget/lun2/ro //设置磁盘为只读

   umount /data/custom_tmp

(3). 为防止恢复出厂设置时删除软件包中的客户软件,增加

      添加vendor/mediatek/project/artifacts/out/target/product/project/data/app/.keep_list文件:

/data/custom/

/data/.layout_version

 

4. 格式化custom分区成FAT格式,

  一直想通过在fstab中添加新项,让vold开机启动时与内置SDFAT分区一样去检测、格式化,因对C++不熟,理解vold机制有点困难,采用另一种折中方案,即在

system\vold\Volume.cpp\Volume::mountVol()函数中添加对custom分区(/dev/block/vold/179:8)的检查与格式化,具体代码如下:

 

#ifdef XXXX_PROJECT_SUPPORT

__CHECK_FAT_AGAIN2:

#define DEVICE_PATH "/dev/block/vold/179:8"

        if (Fat::check(DEVICE_PATH)) {

#ifdef MTK_EMMC_SUPPORT

            if (IsEmmcStorage()) {

                SLOGI("** This is first boot and internal sd is not formatted. Try to format it. (%s)\n", devicePath);

                if (Fat::format(DEVICE_PATH, 0, false)) {

                  SLOGE("Failed to format (%s)", strerror(errno));                

                }

                else {

                    SLOGI("Format successfully. (%s)\n", DEVICE_PATH);

                    goto __CHECK_FAT_AGAIN2;

                }

            }

#endif

            SLOGW("%s failed FS checks, move on to next partition", DEVICE_PATH);

            continue;                                      

        }

 

//exec /data/custom/custom.sh

#define SHELL_CMD "/data/custom/custom.sh"

FILE   *pStream = popen(SHELL_CMD, "r");

if(pStream)

{

SLOGI("exec %s successfully\n", SHELL_CMD);

pclose( pStream);

}

else

{

SLOGE("exec %s failed\n", SHELL_CMD);

}

#endif

 

5. 更改盘符名称,主要是在format时去指定 ”–L”  的参数值,并给出label name,具体请

   参考:http://blog.csdn.net/andylao62/article/details/25606705

 

6. 需应用工程师在应用层监听USB拔插事件,当连接USB时,

   echo /dev/block/vold/179:8 > /sys/devices/platform/mt_usb/musb-hdrc.0/gadget/lun2/file

   断开时

   echo “” > /sys/devices/platform/mt_usb/musb-hdrc.0/gadget/lun2/file

0 0