This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

USB and MSC class sample

Hi everyone,
I've used mass storage code from sample codes of KEIL on AT91SAM7x256.
And it works correctly;
Now I want to change the Memory size show in the My computer (it always show 6 kB!). I'v changed

 MSC_MemorySize

but It still shows 6 KB!
can anyone help me?
thanks for your help!

After that I want to use another type of memory for example SD card instead of SRAM for memory use in this sample. This very important to me. I am so grateful for your help.

Parents
  • > I've used mass storage code from sample codes of KEIL on AT91SAM7x256.

    Do you mean this example on Keil MDK-ARM v4 ?
    C:\Keil\ARM\Boards\Atmel\AT91SAM7X-EK\USB\Memory

    > I'v changed MSC_MemorySize but It still shows 6 KB!

    There are a couple of values you have to touch.

    a) size of ROM DiskImage[] and RAM Memory[] array

    memory.h
    
    /* MSC Disk Image Definitions */
    #define MSC_ImageSize   0x00001000
    

    b) BPB (BIOS Parameter Block) on the ROM DiskImage[] array

    DiskImage[] array holds FAT format (without MBR)

    BPB            1 sector (1 sector = 512 bytes)
    FAT            2
    root directory 1
    file sectors   rest
    

    totalSectors field of BPB shows 0x0010 sectors (in LSB-first format)

    DiskImg.c
    
    const unsigned char DiskImage[MSC_ImageSize] = {
    0xEB,0x3C,0x90,                                           // JmpOpCode
    0x4D,0x53,0x44,0x4F,0x53,0x35,0x2E,0x30,                  // OEMName: MSDOS5.0
    0x00,0x02,                                                // bytesPerSector
    0x01,                                                     // sectorsPerCluster
    0x01,0x00,                                                // reservedSectors
    0x01,                                                     // numberOfFATs
    0x10,0x00,                                                // rootEntries
    0x10,0x00,                                                // totalSectors  <————
    0xF8,                                                     // mediaDescriptor
    0x02,0x00,                                                // sectorsPerFAT
    0x01,0x00,                                                // sectorsPerTrack
    0x01,0x00,                                                // heads
    0x00,0x00,0x00,0x00,                                      // hiddenSectors
    0x00,0x00,0x00,0x00,                                      // bigTotalSectors
    0x00,                                                     // driveNumber
    0x00,                                                     // unused
    0x29,                                                     // extBootSignature
    0x74,0x19,0x02,0x27,                                      // serialNumber
    0x41,0x54,0x53,0x41,0x4D,0x37,0x58,0x5F,0x55,0x53,0x42,   // volumeLabel: ATSAM7X_USB
    0x46,0x41,0x54,0x31,0x32,0x20,0x20,0x20,                  // fileSystemType: FAT12
    

    c) response to SCSI READ_CAPACITY_10 and READ_FORMAT_CAPACITIES

    These SCSI commands returns this volume capacity

    mscuser.h
    
    #define MSC_MemorySize  8192
    

    Assign same number (a multiple of 512) to MSC_ImageSize and MSC_MemorySize
    Divide this number by 512 (number of sectors), and set it to totalSectors field of BPB

    Tsuneo

Reply
  • > I've used mass storage code from sample codes of KEIL on AT91SAM7x256.

    Do you mean this example on Keil MDK-ARM v4 ?
    C:\Keil\ARM\Boards\Atmel\AT91SAM7X-EK\USB\Memory

    > I'v changed MSC_MemorySize but It still shows 6 KB!

    There are a couple of values you have to touch.

    a) size of ROM DiskImage[] and RAM Memory[] array

    memory.h
    
    /* MSC Disk Image Definitions */
    #define MSC_ImageSize   0x00001000
    

    b) BPB (BIOS Parameter Block) on the ROM DiskImage[] array

    DiskImage[] array holds FAT format (without MBR)

    BPB            1 sector (1 sector = 512 bytes)
    FAT            2
    root directory 1
    file sectors   rest
    

    totalSectors field of BPB shows 0x0010 sectors (in LSB-first format)

    DiskImg.c
    
    const unsigned char DiskImage[MSC_ImageSize] = {
    0xEB,0x3C,0x90,                                           // JmpOpCode
    0x4D,0x53,0x44,0x4F,0x53,0x35,0x2E,0x30,                  // OEMName: MSDOS5.0
    0x00,0x02,                                                // bytesPerSector
    0x01,                                                     // sectorsPerCluster
    0x01,0x00,                                                // reservedSectors
    0x01,                                                     // numberOfFATs
    0x10,0x00,                                                // rootEntries
    0x10,0x00,                                                // totalSectors  <————
    0xF8,                                                     // mediaDescriptor
    0x02,0x00,                                                // sectorsPerFAT
    0x01,0x00,                                                // sectorsPerTrack
    0x01,0x00,                                                // heads
    0x00,0x00,0x00,0x00,                                      // hiddenSectors
    0x00,0x00,0x00,0x00,                                      // bigTotalSectors
    0x00,                                                     // driveNumber
    0x00,                                                     // unused
    0x29,                                                     // extBootSignature
    0x74,0x19,0x02,0x27,                                      // serialNumber
    0x41,0x54,0x53,0x41,0x4D,0x37,0x58,0x5F,0x55,0x53,0x42,   // volumeLabel: ATSAM7X_USB
    0x46,0x41,0x54,0x31,0x32,0x20,0x20,0x20,                  // fileSystemType: FAT12
    

    c) response to SCSI READ_CAPACITY_10 and READ_FORMAT_CAPACITIES

    These SCSI commands returns this volume capacity

    mscuser.h
    
    #define MSC_MemorySize  8192
    

    Assign same number (a multiple of 512) to MSC_ImageSize and MSC_MemorySize
    Divide this number by 512 (number of sectors), and set it to totalSectors field of BPB

    Tsuneo

Children
  • Dear Tsuneo,
    Yes, I mean that.
    Thank you so much.
    Now I got something.Your answers are the most effective and complete ones all over this forum.
    In my

     DiskImg.c
    

    , it just the numbers without the details (descriptions you write).

    /* Disk Image */
    
    #include "memory.h"
    
    const unsigned char DiskImage[MSC_ImageSize] = {
    0xEB,0x3C,0x90,0x4D,0x53,0x44,0x4F,0x53,0x35,0x2E,0x30,0x00,0x02,0x01,0x01,0x00,
    0x01,0x10,0x00,0x10,0x00,0xF8,0x02,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x74,0x19,0x02,0x27,0x41,0x54,0x53,0x41,0x4D,
    0x37,0x58,0x5F,0x55,0x53,0x42,0x46,0x41,0x54,0x31,0x32,0x20,0x20,0x20,0x33,0xC9,
    0x8E,0xD1,0xBC,0xF0,0x7B,0x8E,0xD9,0xB8,0x00,0x20,0x8E,0xC0,0xFC,0xBD,0x00,0x7C,
    0x38,0x4E,0x24,0x7D,0x24,0x8B,0xC1,0x99,0xE8,0x3C,0x01,0x72,0x1C,0x83,0xEB,0x3A,
    0x66,0xA1,0x1C,0x7C,0x26,0x66,0x3B,0x07,0x26,0x8A,0x57,0xFC,0x75,0x06,0x80,0xCA,
    0x02,0x88,0x56,0x02,0x80,0xC3,0x10,0x73,0xEB,0x33,0xC9,0x8A,0x46,0x10,0x98,0xF7,
    0x66,0x16,0x03,0x46,0x1C,0x13,0x56,0x1E,0x03,0x46,0x0E,0x13,0xD1,0x8B,0x76,0x11,
    0x60,0x89,0x46,0xFC,0x89,0x56,0xFE,0xB8,0x20,0x00,0xF7,0xE6,0x8B,0x5E,0x0B,0x03,
    0xC3,0x48,0xF7,0xF3,0x01,0x46,0xFC,0x11,0x4E,0xFE,0x61,0xBF,0x00,0x00,0xE8,0xE6,
    0x00,0x72,0x39,0x26,0x38,0x2D,0x74,0x17,0x60,0xB1,0x0B,0xBE,0xA1,0x7D,0xF3,0xA6,
    0x61,0x74,0x32,0x4E,0x74,0x09,0x83,0xC7,0x20,0x3B,0xFB,0x72,0xE6,0xEB,0xDC,0xA0,
    0xFB,0x7D,0xB4,0x7D,0x8B,0xF0,0xAC,0x98,0x40,0x74,0x0C,0x48,0x74,0x13,0xB4,0x0E,
    0xBB,0x07,0x00,0xCD,0x10,0xEB,0xEF,0xA0,0xFD,0x7D,0xEB,0xE6,0xA0,0xFC,0x7D,0xEB,
    0xE1,0xCD,0x16,0xCD,0x19,0x26,0x8B,0x55,0x1A,0x52,0xB0,0x01,0xBB,0x00,0x00,0xE8,
    0x3B,0x00,0x72,0xE8,0x5B,0x8A,0x56,0x24,0xBE,0x0B,0x7C,0x8B,0xFC,0xC7,0x46,0xF0,
    0x3D,0x7D,0xC7,0x46,0xF4,0x29,0x7D,0x8C,0xD9,0x89,0x4E,0xF2,0x89,0x4E,0xF6,0xC6,
    0x06,0x96,0x7D,0xCB,0xEA,0x03,0x00,0x00,0x20,0x0F,0xB6,0xC8,0x66,0x8B,0x46,0xF8,
    0x66,0x03,0x46,0x1C,0x66,0x8B,0xD0,0x66,0xC1,0xEA,0x10,0xEB,0x5E,0x0F,0xB6,0xC8,
    0x4A,0x4A,0x8A,0x46,0x0D,0x32,0xE4,0xF7,0xE2,0x03,0x46,0xFC,0x13,0x56,0xFE,0xEB,
    0x4A,0x52,0x50,0x06,0x53,0x6A,0x01,0x6A,0x10,0x91,0x8B,0x46,0x18,0x96,0x92,0x33,
    0xD2,0xF7,0xF6,0x91,0xF7,0xF6,0x42,0x87,0xCA,0xF7,0x76,0x1A,0x8A,0xF2,0x8A,0xE8,
    0xC0,0xCC,0x02,0x0A,0xCC,0xB8,0x01,0x02,0x80,0x7E,0x02,0x0E,0x75,0x04,0xB4,0x42,
    0x8B,0xF4,0x8A,0x56,0x24,0xCD,0x13,0x61,0x61,0x72,0x0B,0x40,0x75,0x01,0x42,0x03,
    0x5E,0x0B,0x49,0x75,0x06,0xF8,0xC3,0x41,0xBB,0x00,0x00,0x60,0x66,0x6A,0x00,0xEB,
    0xB0,0x4E,0x54,0x4C,0x44,0x52,0x20,0x20,0x20,0x20,0x20,0x20,0x0D,0x0A,0x52,0x65,
    0x6D,0x6F,0x76,0x65,0x20,0x64,0x69,0x73,0x6B,0x73,0x20,0x6F,0x72,0x20,0x6F,0x74,
    0x68,0x65,0x72,0x20,0x6D,0x65,0x64,0x69,0x61,0x2E,0xFF,0x0D,0x0A,0x44,0x69,0x73,
    0x6B,0x20,0x65,0x72,0x72,0x6F,0x72,0xFF,0x0D,0x0A,0x50,0x72,0x65,0x73,0x73,0x20,
    0x61,0x6E,0x79,0x20,0x6B,0x65,0x79,0x20,0x74,0x6F,0x20,0x72,0x65,0x73,0x74,0x61,
    0x72,0x74,0x0D,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAC,0xCB,0xD8,0x55,0xAA,
    0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    ....
    


    and I don't know what they are but now I understand and go to change the code according to your help. And can you name a reference to make these numbers clear for me?
    And what about the another question? Can you help me as clear as your previous answer.
    I want to use another type of memory for example SD card or internal FLASH.
    I will be so grateful.
    Thank you again.

  • Dear Per,
    You are right. But I have no idea about the numbers in DiskImg.c so I don't know what to search. And thank you so much.

    I have a another question. How I can change the properties of the file readme.txt that shows in the computer inside the flash memory? I mean that the file would be for example read only and the users in the computer could not change that?

  • A file is read-only if the directory entry has the read-only flag, or if the file system is mounted read-only.

    How to change the read-only flag for a directory entry? Same suggestion as in my previous post. Google can find all information about the structures of a FAT file system. The boot record - which I have already given you multiple references to, allows you to figure out the location of the root directory. And that is where you find the directory entry for your "readme.txt" file, and so can find the attributes flag field.

    A directory in a FAT file system is just a file but with an attribute flag saying it's a directory. So the documentation available about the FAT file system allows anyone interested to also figure out how to locate directory entries of files in subdirectories. And how to locate the actual file data for files.

    There are even a number of binary editor programs that are able to view information as important structures of FAT file systems - originally intended for people trying to recover data from broken diskettes or hard disks.

    But in the end, you'll get better progress if you spend time trying to search for information. Each attempt you learn how to make better and better searches.

  • To make media content Write protect you need to return WP bit set to one in ModeSense response.

    In mscuser.c module change ModeSense6/ModeSense10 functions:

    void MSC_ModeSense6 (void) {
    
      if (!DataInFormat()) return;
    
      BulkBuf[ 0] = 0x03;
      BulkBuf[ 1] = 0x00;
      BulkBuf[ 2] = 0x80;   <---- was 0x00
      BulkBuf[ 3] = 0x00;
      ...
    }
    
    void MSC_ModeSense10 (void) {
    
      if (!DataInFormat()) return;
    
      BulkBuf[ 0] = 0x00;
      BulkBuf[ 1] = 0x06;
      BulkBuf[ 2] = 0x00;
      BulkBuf[ 3] = 0x80;   <---- was 0x00
      BulkBuf[ 4] = 0x00;
      BulkBuf[ 5] = 0x00;
      ...
    }
    

    To retarget media from memory to SD Card you need to retarget read and writes from memory to SD Card.
    So you need to change functions MSC_MemoryRead, MSC_MemoryWrite and MSC_MemoryVerify functions in mscuser.c file to use SD Card write/read instead of memory write/read.

  • Dear Friends,
    i really appreciate your concern and help. I am going to do what yo said and read what you referenced.

  • Note that by making the media write-protected, all files will be write-protected.

    This is different from adjusting the directory entry for readme.txt and just make that file read-only.

  • Dear Per,
    I think I noticed that they are different.
    I'm so thankful for the support.

  • Just note that you can take the DiskImage hex data and place in a little source file that you compile and that writes the data into a binary file on the PC.

    Then open that binary file with a good hex editor that supports FAT data structures. Then you can edit the data and save.

    Then use a program to convert the binary file to a C hex dump again.

  • Thanks Tsuneo for excellent explanation od DiskImage.

    I have related question, I connected my mcb2300 board with lpc2378 controller to my PC, using ARM\Boards\Keil\MCB2300\RL\USB\Device\Memory example, and it works fine, I changed name of volume, txt file in DiskImage, but can I write some txt file to controller memory using windows, like to regular USB flash drive ?