This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

use ATA_format in C5515

Please guide me how  to use ATA_format in C5515.

Please provide a sample code.

  • Have you checked out the CSL_MMCSD_SdCardFSDirExample in CSL?

    Regards.

  • Hi Steve,

    I have checked out the CSL_MMCSD_SdCardFSDirExample in CSL. But I didn't see any example code for ATA_format.

    Not find any ATA_format example code in csl_mmcsd_atafs_ext_example.c ,  csl_mmcsd_atafs_example.c and csl_mmcsd_atafs_dir_example.c.

    What parameter should I use for ATA_format? (AtaState *pDrive, int flag)

    If there are 3 SD cards , how to get pDrive for each SD card?

    AtaError ATA_format(AtaState *pDrive, int flag)
    {
    AtaSector testsector, testsector1;
    int x; AtaError ret_stat = ATA_ERROR_NONE;
    AtaUint16 *_AtaWriteBuffer = pDrive->_AtaWriteBuffer;
    AtaUint16 _AtaWriteBuffer1[256];
    /*SUSMIT - FAT32 format fix*/
    AtaSector PhySector;
    AtaUint16 fOffset, fAlign;
    AtaCluster write_cluster, RootCluster;
    int LastCluster = 0;
    unsigned short FatNo;
    /*SUSMIT - FAT32 format fix*/

    if (pDrive==NULL) return(ATA_ERROR_INVALID_PARAM); //KR042810

    for(x=0; x< 256; x++) _AtaWriteBuffer1[x] = 0;
    /*Removed this on order to reduce memory, we won't remember boot records
    so, our format won't be able to fix disks with Bad MBR/BR but will
    be able to format*/
    #if 0
    switch(pDrive->FatType) {
    case ATA_FAT_TYPE_12:
    /*write MBR*/
    ret_stat = _AtaReadSector((AtaSector)0, pDrive, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSector((AtaSector)0, pDrive->pAtaMediaState, &MBR_8MB_FAT12_MMC[0], 0);
    if(ret_stat) return(ret_stat);
    /*Write BR*/
    ret_stat = _AtaReadSector((AtaSector)pDrive->BootPhySector, pDrive, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSector((AtaSector)pDrive->BootPhySector, pDrive->pAtaMediaState, &BR_8MB_FAT12_MMC[0], 0);
    if(ret_stat) return(ret_stat);
    break;
    case ATA_FAT_TYPE_16:
    /*Write MBR*/
    ret_stat = _AtaReadSector((AtaSector)0, pDrive, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSector((AtaSector)0, pDrive->pAtaMediaState, &MBR_32MB_FAT16_MMC[0], 0);
    if(ret_stat) return(ret_stat);
    /*Write BR*/
    ret_stat = _AtaReadSector((AtaSector)pDrive->BootPhySector, pDrive, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSector((AtaSector)pDrive->BootPhySector, pDrive->pAtaMediaState, &BR_32MB_FAT16_MMC[0], 0);
    if(ret_stat) return(ret_stat);
    break;
    case ATA_FAT_TYPE_32:
    /*Write MBR*/
    ret_stat = _AtaReadSector((AtaSector)0, pDrive, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSector((AtaSector)0, pDrive->pAtaMediaState, &MBR_32MB_FAT16_MMC[0], 0);
    if(ret_stat) return(ret_stat);
    /*Write BR*/
    ret_stat = _AtaReadSector((AtaSector)pDrive->BootPhySector, pDrive, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSector((AtaSector)pDrive->BootPhySector, pDrive->pAtaMediaState, &BR_32MB_FAT16_MMC[0], 0);
    if(ret_stat) return(ret_stat);
    break;
    default: return(ATA_ERROR_BAD_MEDIA);
    }
    #endif
    /*Clear FAT*/
    if(pDrive->FatType == ATA_FAT_TYPE_32) {
    /*SUSMIT - FAT32 format fix*/
    RootCluster = _AtaReadDoubleWord(pDrive->BootPhySector, pDrive, 44); /* Fat Size/Sector Count byte 36 - 39 */
    ret_stat = _AtaReadSector((AtaSector)pDrive->RootDirSector, pDrive, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    _AtaWriteBuffer1[0] = 0xFFF8;
    _AtaWriteBuffer1[1] = 0xFFFF;
    _AtaWriteBuffer1[2] = 0xFFF8;
    _AtaWriteBuffer1[3] = 0xFFFF;
    _AtaWriteBuffer1[4] = 0xFFF8;
    _AtaWriteBuffer1[5] = 0xFFFF;
    ret_stat = pDrive->AtaWriteSector((AtaSector)pDrive->RootDirSector, pDrive->pAtaMediaState, &_AtaWriteBuffer1[0], 0);
    if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSectorFlush(pDrive->pAtaMediaState);
    if(ret_stat) return(ret_stat);
    for(FatNo=0; FatNo<pDrive->NumberOfFats; FatNo++)
    {
    PhySector = _AtaCalculatePhySectorAndOffsetOfFatEntry(RootCluster, pDrive, &fOffset, &fAlign);
    PhySector +=
    (
    (unsigned long)FatNo *
    pDrive->LogSectorsPerFat *
    (unsigned long)(pDrive->WordsPerLogSector/ATA_WORDS_PER_PHY_SECTOR)
    );
    ret_stat = _AtaReadFatEntryAtPhySector(PhySector, pDrive, fOffset, fAlign, &LastCluster, &write_cluster);
    if(ret_stat) return(ret_stat);
    ret_stat = _AtaWriteFatEntryAtPhySector(PhySector, pDrive, 0x0FFFFFFF, fOffset, fAlign, 1,1);
    if(ret_stat) return(ret_stat);
    }
    /*SUSMIT - FAT32 format fix*/
    }
    else {
    testsector=pDrive->FirstFatSector;
    ret_stat = _AtaReadSector((AtaSector)testsector, pDrive, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    _AtaWriteBuffer1[0] = 0xFFF8;
    _AtaWriteBuffer1[1] = 0xFFFF;
    ret_stat = pDrive->AtaWriteSector((AtaSector)testsector++, pDrive->pAtaMediaState, &_AtaWriteBuffer1[0], 0);
    if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSectorFlush(pDrive->pAtaMediaState);
    if(ret_stat) return(ret_stat);
    _AtaWriteBuffer1[0] = 0;
    _AtaWriteBuffer1[1] = 0;
    testsector1 = pDrive->FirstFatSector+pDrive->LogSectorsPerFat;
    while(testsector<testsector1) {
    ret_stat = _AtaReadSector((AtaSector)testsector, pDrive, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSector((AtaSector)testsector++, pDrive->pAtaMediaState, &_AtaWriteBuffer1[0], 0);
    if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSectorFlush(pDrive->pAtaMediaState);
    if(ret_stat) return(ret_stat);
    }
    ret_stat = _AtaReadSector((AtaSector)testsector, pDrive, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    _AtaWriteBuffer1[0] = 0xFFF8;
    _AtaWriteBuffer1[1] = 0xFFFF;
    ret_stat = pDrive->AtaWriteSector((AtaSector)testsector++, pDrive->pAtaMediaState, &_AtaWriteBuffer1[0], 0);
    if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSectorFlush(pDrive->pAtaMediaState);
    if(ret_stat) return(ret_stat);
    _AtaWriteBuffer1[0] = 0;
    _AtaWriteBuffer1[1] = 0;
    testsector1 = pDrive->FirstDataSector;
    while(testsector<testsector1) {
    ret_stat = _AtaReadSector((AtaSector)testsector, pDrive, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSector((AtaSector)testsector++, pDrive->pAtaMediaState, &_AtaWriteBuffer1[0], 0);
    if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSectorFlush(pDrive->pAtaMediaState);
    if(ret_stat) return(ret_stat);
    } }
    /*only for full format*/
    if (flag) {
    testsector = pDrive->FirstDataSector;
    while(testsector<=pDrive->TotalSectors) {
    ret_stat = _AtaReadSector((AtaSector)testsector, pDrive, &_AtaWriteBuffer[0], 0);
    if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSector((AtaSector)testsector++, pDrive->pAtaMediaState, &_AtaWriteBuffer1[0], 0);
    if(ret_stat) return(ret_stat);
    ret_stat = pDrive->AtaWriteSectorFlush(pDrive->pAtaMediaState);
    if(ret_stat) return(ret_stat);
    } }
    /* SUSMIT - 25 FEB 2003 - NMP*/
    /* ret_stat = ATA_systemInit(pDrive);*/
    ret_stat = ATA_systemInit(pDrive,0);
    /* SUSMIT - 25 FEB 2003 - NMP*/
    return(ret_stat);
    }

  • If I understand you correctly, formatting a SD card is not part of the C55 CSL API. The examples are interfacing to a formatted card.

    Regards.

  • Hi Steve,

    Could your team provide ATA_format example in C55xx?  (ata.h)

    I need to use ATA_format for formatting a SD card in my products in C5515.

    Best Regards,

    ata.h
  • All available examples are provided in current CSL release. No update release is planned.

    Regards.

  • Hi Steve,

    I found all of CSL folder , I didn't find any ATA_format example.
    As mentioned before , I don't know what param need to use in ATA_format? (AtaState *pDrive, int flag)
    How to know pDrive? How to know flag? What value/parameter should I use?

    Best Regards,

  • Any updates?

  •  

    You need to pass AtaState state structure as first parameter to ATA_format() function. Second parameter 'flag' is to choose full format where all the data sectors on the card will be erased. You can set 'flag' to '0' for initial verification.

     

    Check  mmcConfigFs() function in 'CSL_MMCSD_SdCardFSExample\csl_mmcsd_atafs_example.c' CSL example. You can call ATA_format function just after ATA_systemInit function call as below

    ATA_format(gpstrAtaDrive, 0);

     

    Note that ATA_format() function is more suitable for re-formatting a card but may not work with a raw card which don't have a proper file system. It uses AtaState structure values populated by ATA_systemInit() which works only with properly formatted card.

    - Pratap.