双内置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开机启动时与内置SD卡FAT分区一样去检测、格式化,因对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
- 双内置SD卡的实现
- SD卡 内置DMA的使用
- Android手机内置SD卡路径的获取
- Android获取内置和外置sd卡路径的方法
- android安卓让你的16g,32g外置SD卡瞬间变成内置SD卡
- Android中获取内置SD卡和外置SD卡路径的方法
- Android-->检测内置/外置SD卡存储卡,枚举所有挂载点(通过反射实现),监听SD卡广播
- Android判断获取内置外置sd卡
- 获取内置sd卡和外置sd卡的方法!经三星pad SM T585c型号测试有效。
- sd卡在位检测的实现方式
- SD卡加密的技术实现思路
- 获取SD卡 tf卡 内置外置存储卡路径名称 路径的方式
- usb连接的PTP模式,同时显示内置、外置SD卡内容
- Android中的Environment.getExternalStorageState使用,对内置外置SD卡的判断
- android 手机内置,sd卡存储的存储路径和空间问题
- Android4.0实现双sd卡
- Android下c++调用java实现内置外置sd卡MP3扫描并保存在文件中
- Linux挂在米2的内置SD存储
- C/C++经典题解析
- 求解!关于Http和Socket
- POI实战-java开发excel详解之附录
- C++ 结构体字节对齐
- 排序算法:堆排序
- 双内置SD卡的实现
- 找不到curl/curl.h,libcurl库的安装。
- Linq之序列化不包含任何元素问题怎么解决?
- HDU 2157 How many ways??(矩阵快速幂)
- JS输入手机号码加空格
- SQLServer 可变字符怎么设置长度?(如varchar)
- 在windows下编译mongodb c driver
- Java中判断字符串是否为数字的五种方法
- 初识AWK