Intel-T4-6.0 vold相关分析及添加NTFS支持

本文分析了Intel-T4平台vold服务与NTFS文件系统的集成过程,包括公共卷与私有卷的挂载,调整卷盘符,以及启用kVisible标志。同时,提到了在Android.mk中添加Ntfs.cpp源文件的步骤。
摘要由CSDN通过智能技术生成
关于 vold 的详细分析可以参考 这篇文章
此文主要是用来记录工作中添加 NTFS 格式支持时遇到的一些问题。文章是基于 intel 的 CherryTrail T4 平台的 Android 6.0 版本来分析的,其他平台上大致流程应该也差不多。

(由于Ntfs.cpp/Ntfs.h文件是从MTK平台porting过来的,这里就不贴出了)


  • Public Volume & Private Volume
从 6.0 开始,Google 将 Volume 分成了 Public Volume(TF卡,U盘等一系列Mbr分区的disk) 和 Private Volume(Gpt分区的扩展存储)
关于两种 Volume 的区分和创建相关代码逻辑在 vold 源码目录下的 Disk.cpp 中。

            if (table == Table::kMbr) {
                const char* type = strtok(nullptr, kSgdiskToken);
                LOG(ERROR) << "readPartitions disk type is " << type;// add linqihan

                switch (strtol(type, nullptr, 16)) {
                case 0x06: // FAT16
                case 0x07: // add by linqihan, for NTFS or ExFat
                case 0x0b: // W95 FAT32 (LBA)
                case 0x0c: // W95 FAT32 (LBA)
                case 0x0e: // W95 FAT16 (LBA)
                    createPublicVolume(partDevice);
                    break;
                }
            } else if (table == Table::kGpt) {
                const char* typeGuid = strtok(nullptr, kSgdiskToken);
                const char* partGuid = strtok(nullptr, kSgdiskToken);

                if (!strcasecmp(typeGuid, kGptBasicData)) {
                    createPublicVolume(partDevice);
                } else if (!strcasecmp(typeGuid, kGptAndroidExpand)) {
                    createPrivateVolume(partDevice, partGuid);
                }
            }

通过添加相应的case,NTFS格式的U盘现在可以被识别并且创建出相应的 Public Volume。
U盘和 TF卡相应的 Block 块文件在设备中的 /dev/block/vold/ 目录下,当且仅当设备识别出该硬件并且创建出相应的 disk 和 volume 时,该路径下才会有相应的文件
以 U 盘为例:

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个基于Matlab实现Vold-Kalman滤波器的代码示例: ``` function [xhat,Phat] = vold_kalman(y,u,x0,P0,Q,R,dt) % Vold-Kalman滤波器 % 输入: % y - 观测数据 % u - 控制数据 % x0 - 初始状态 % P0 - 初始协方差矩阵 % Q - 过程噪声协方差矩阵 % R - 观测噪声协方差矩阵 % dt - 时间步长 % 输出: % xhat - 状态估计值 % Phat - 协方差估计矩阵 % 系统模型 f = @(x, u) [x(1) + u(1)*cos(x(3))*dt; x(2) + u(1)*sin(x(3))*dt; x(3) + u(2)*dt]; h = @(x) [atan2(x(2),x(1)); sqrt(x(1)^2 + x(2)^2)]; % 初始化滤波器 xhat = x0; Phat = P0; % 迭代 for i = 1:length(y) % 预测 uhat = u(:,i); [xhat, Fx, Fu, Q] = ekf_predict(f, xhat, uhat, Phat, Q, dt); % 更新 yhat = y(:,i); [xhat, Phat, H, R] = ekf_update(h, xhat, yhat, Phat, R); % 存储结果 X(:,i) = xhat; P_all(:,:,i) = Phat; end end function [xhat,Fx,Fu,Q] = ekf_predict(f,x,u,P,Q,dt) % 扩展卡尔曼滤波器预测 % 输入: % f - 状态方程 % x - 状态估计值 % u - 控制输入 % P - 协方差估计矩阵 % Q - 过程噪声协方差矩阵 % dt - 时间步长 % 输出: % xhat - 预测状态估计值 % Fx - 状态转移矩阵 % Fu - 控制输入矩阵 % Q - 更新后的过程噪声协方差矩阵 % 计算状态转移矩阵和控制输入矩阵 [Fx,Fu] = jacobian(f,x,u); % 预测状态估计值和协方差矩阵 xhat = f(x,u); P = Fx*P*Fx' + Fu*Q*Fu'; % 更新过程噪声协方差矩阵 Q = diag([0.01,0.01,0.01]); % TODO: 根据实际问题调整 end function [xhat,P,H,R] = ekf_update(h,x,y,P,R) % 扩展卡尔曼滤波器更新 % 输入: % h - 观测方程 % x - 状态估计值 % y - 观测值 % P - 协方差估计矩阵 % R - 观测噪声协方差矩阵 % 输出: % xhat - 更新后的状态估计值 % P - 更新后的协方差估计矩阵 % H - 观测矩阵 % R - 更新后的观测噪声协方差矩阵 % 计算观测矩阵 H = jacobian(h,x); % 计算观测噪声协方差矩阵 R = diag([0.1,0.1]); % TODO: 根据实际问题调整 % 计算卡尔曼增益 K = P*H'/(H*P*H' + R); % 更新状态估计值和协方差矩阵 xhat = x + K*(y - h(x)); P = (eye(size(P)) - K*H)*P; end function [F,J] = jacobian(f,x,u) % 计算函数f(x,u)关于x和u的雅可比矩阵 % 输入: % f - 目标函数 % x - 自变量x % u - 自变量u % 输出: % F - 状态转移矩阵 % J - 控制输入矩阵 % 计算状态转移矩阵 n = length(x); Fx = zeros(n,n); for i = 1:n Fx(:,i) = gradient(f(x,u),x(i)); end F = eye(n) + Fx; % 计算控制输入矩阵 if nargin > 2 m = length(u); Fu = zeros(n,m); for i = 1:m Fu(:,i) = gradient(f(x,u),u(i)); end J = Fu; end end ``` 这个代码示例中实现了Vold-Kalman滤波器的预测和更新步骤,同时也使用了扩展卡尔曼滤波器(EKF)来处理非线性系统。需要根据具体问题调整系统模型和协方差矩阵,以获得更好的滤波效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值