Chinaunix首页 | 论坛 | 博客
  • 博客访问: 940880
  • 博文数量: 192
  • 博客积分: 3070
  • 博客等级: 中校
  • 技术积分: 1861
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-27 23:44
个人简介

Start Linux Leave Linux a while Back to Linux

文章分类

全部博文(192)

文章存档

2023年(18)

2022年(11)

2021年(8)

2020年(14)

2019年(7)

2018年(13)

2017年(16)

2016年(4)

2012年(2)

2011年(13)

2010年(26)

2009年(13)

2008年(27)

2007年(20)

我的朋友

分类: LINUX

2010-03-15 12:02:07

Platform: S3C2416 + Linux-2.6.21
 
如何修改SD卡的卷标?
本来想通过 e2lable或mlabel等工具来修改的,但是这些工具并不合适, e2lable只是针对 ext2, ext3这两种文件系统的, mlabel是针对 FAT 格式的文件系统, 但在SDK上无法使用。所以放弃使用第3方软件来修改卷标。
 
分析 linux USB驱动的代码,在USB枚举的过程中并没有发现有读取卷标的配置,故可以判定,卷标是保存在SD卡的某个位置上的,所以找了一些资料分析SD卡的结构。
 
通过分析得知,对于FAT16格式的SD卡,其文件系统的格式是保存在 0扇区的 0x36的位置(lba=0),卷标是保存在480扇区(lba=480),所以将新的卷标名写到 lba=480的位置就可以了。
 
对于FAT32格式的SD卡,其文件系统的格式是保存在 0扇区的 0x52的位置(lba=0),卷标是保存在7528扇区(lba=7528),所以将新的卷标名写到 lba=7528的位置就可以了。
 
以下是实现重命名的部分代码:
 

        /* Perform the read */
        file_offset_tmp = file_offset;
        nread = vfs_read(curlun->filp,
                (char __user *) bh->buf,
                amount, &file_offset_tmp);
        VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,
                (unsigned long long) file_offset,
                (int) nread);

        // Check FATx Format?

        if(lba==0)
        {
            char *p=NULL;
            p = (char *)bh->buf;

            // FAT16 ? Sector[0] 0x36 save FATx format

            if(p[57]==0x31)
            {
                FATx = 0;
                VLDBG(curlun, "The Card Format is: FAT16\n");
            }
            // FAT32 ? Sector[0] 0x32 save FATx format

            if(p[85]==0x33)
            {
                FATx = 1;
                VLDBG(curlun, "The Card Format is: FAT32\n");
            }
        }
        // FAT16: Modify SD Card Volume -> AAA BBB

        // FAT16: Volume Name save as sector[480]

        if(lba==480 && !FATx)
        {
            char *p=NULL;
            p = (char *)bh->buf;
            
            p[0] = 0x41;
            p[1] = 0x41;
            p[2] = 0x41;
            p[3] = 0x20;
            p[4] = 0x42;
            p[5] = 0x42;
            p[6] = 0x42;

        }
        // FAT32: Modify SD Card Volume -> RCA eRdR

        // FAT32: Volume Name save as sector[7528]

        if(lba==7528 && FATx)
        {
            char *p=NULL;
            p = (char *)bh->buf;
            
            p[0] = 0x41;
            p[1] = 0x41;
            p[2] = 0x41;
            p[3] = 0x20;
            p[4] = 0x42;
            p[5] = 0x42;
            p[6] = 0x42;
        }        

 

貌似盘符的问题解决了,但仔细测试后,发现如果盘符之前是没有的,也就是在电脑上显示[可移动磁盘]的,对于这样的SD卡还是无法重命名,以上的改动只是针对之前盘符有重名的,所以还得另想办法。

没办法,还是觉得 mlabel 比较简单,所以下载了

mtools_3.9.11.orig.tar.gz,然后编译成 arm 版本的,

./configure --prefix=$PWD/_install --disable-floppyd --host=arm CC=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-gcc-4.2.2

make

将生成的 mtools 放到SDK的文件系统 /bin 中,mtools是包括很多个命令的,如 mcd, mlabel ,我这里只用到了 mlabel, 所以在 /bin新建一个链接

ln -s mtools mlabel

在运行这个命令之前,还须在 ~(主目录)创建 .mtoolsrc 文件,包括以下内容:

[root /]$ vi .mtoolsrc

drive f: file="/dev/mmcblk0p1"
mtools_skip_check=1

有这个文件之后就可以使用 mlabel 这个工具修改盘符了。

[root /]$ mlabel f:AAA\ BBB


 

阅读(4503) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~