注册 登录
查看: 424|回复: 1

[K60] 关于SDHC扇区的问题

[复制链接]
发表于 2014-5-18 16:54:31 | 显示全部楼层 |阅读模式
/*-----------------------------------------------------------------------*/
/* Write File                                                            */
/*-----------------------------------------------------------------------*/

FRESULT f_write (
    FIL *fp,                        /* Pointer to the file object */
    const void *buff,        /* Pointer to the data to be written */
    UINT btw,                        /* Number of bytes to write */
    UINT *bw                        /* Pointer to number of bytes written */
)
{
    FRESULT res;
    DWORD clst, sect;
    UINT wcnt, cc;
    const BYTE *wbuff = buff;
    BYTE csect;


    *bw = 0;        /* Initialize byte counter */

    res = validate(fp->fs, fp->id);                        /* Check validity */
    if (res != FR_OK) LEAVE_FF(fp->fs, res);
    if (fp->flag & FA__ERROR)                                /* Aborted file? */
        LEAVE_FF(fp->fs, FR_INT_ERR);
    if (!(fp->flag & FA_WRITE))                                /* Check access mode */
        LEAVE_FF(fp->fs, FR_DENIED);
    if ((DWORD)(fp->fsize + btw) < fp->fsize) btw = 0;        /* File size cannot reach 4GB */

    for ( ;  btw;                                                        /* Repeat until all data written */
            wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt)
    {
        if ((fp->fptr % SS(fp->fs)) == 0)          /* On the sector boundary? */
        {
            csect = (BYTE)(fp->fptr / SS(fp->fs) & (fp->fs->csize - 1));        /* Sector offset in the cluster */
            if (!csect)                                          /* On the cluster boundary? */
            {
                if (fp->fptr == 0)                  /* On the top of the file? */
                {
                    clst = fp->sclust;                /* Follow from the origin */
                    if (clst == 0)                        /* When no cluster is allocated, */
                        fp->sclust = clst = create_chain(fp->fs, 0);        /* Create a new cluster chain */
                }
                else                                          /* Middle or end of the file */
                {
#if _USE_FASTSEEK
                    if (fp->cltbl)
                        clst = clmt_clust(fp, fp->fptr);        /* Get cluster# from the CLMT */
                    else
#endif
                        clst = create_chain(fp->fs, fp->clust);        /* Follow or stretch cluster chain on the FAT */
                }
                if (clst == 0) break;                /* Could not allocate a new cluster (disk full) */
                if (clst == 1) ABORT(fp->fs, FR_INT_ERR);
                if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR);
                fp->clust = clst;                        /* Update current cluster */
            }
#if _FS_TINY
            if (fp->fs->winsect == fp->dsect && move_window(fp->fs, 0))        /* Write-back sector cache */
                ABORT(fp->fs, FR_DISK_ERR);
#else
            if (fp->flag & FA__DIRTY)                  /* Write-back sector cache */
            {
                if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK)
                    ABORT(fp->fs, FR_DISK_ERR);
                fp->flag &= ~FA__DIRTY;
            }
#endif
            sect = clust2sect(fp->fs, fp->clust);        /* Get current sector */
            if (!sect) ABORT(fp->fs, FR_INT_ERR);
            sect += csect;
            cc = btw / SS(fp->fs);                        /* When remaining bytes >= sector size, */
            if (cc)                                                  /* Write maximum contiguous sectors directly */
            {
                if (csect + cc > fp->fs->csize)        /* Clip at cluster boundary */
                    cc = fp->fs->csize - csect;
                if (disk_write(fp->fs->drv, wbuff, sect, (BYTE)cc) != RES_OK)
                    ABORT(fp->fs, FR_DISK_ERR);
#if _FS_TINY
                if (fp->fs->winsect - sect < cc)          /* Refill sector cache if it gets invalidated by the direct write */
                {
                    mem_cpy(fp->fs->win, wbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), SS(fp->fs));
                    fp->fs->wflag = 0;
                }
#else
                if (fp->dsect - sect < cc)   /* Refill sector cache if it gets invalidated by the direct write */
                {
                    mem_cpy(fp->buf, wbuff + ((fp->dsect - sect) * SS(fp->fs)), SS(fp->fs));
                    fp->flag &= ~FA__DIRTY;
                }
#endif
                wcnt = SS(fp->fs) * cc;                /* Number of bytes transferred */
                continue;
            }
#if _FS_TINY
            if (fp->fptr >= fp->fsize)          /* Avoid silly cache filling at growing edge */
            {
                if (move_window(fp->fs, 0)) ABORT(fp->fs, FR_DISK_ERR);
                fp->fs->winsect = sect;
            }
#else
            if (fp->dsect != sect)                  /* Fill sector cache with file data */
            {
                if (fp->fptr < fp->fsize &&
                        disk_read(fp->fs->drv, fp->buf, sect, 1) != RES_OK)
                    ABORT(fp->fs, FR_DISK_ERR);
            }
#endif
            fp->dsect = sect;
        }
        wcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs));/* Put partial sector into file I/O buffer */
        if (wcnt > btw) wcnt = btw;
#if _FS_TINY
        if (move_window(fp->fs, fp->dsect))        /* Move sector window */
            ABORT(fp->fs, FR_DISK_ERR);
        mem_cpy(&fp->fs->win[fp->fptr % SS(fp->fs)], wbuff, wcnt);        /* Fit partial sector */
        fp->fs->wflag = 1;
#else
        mem_cpy(&fp->buf[fp->fptr % SS(fp->fs)], wbuff, wcnt);        /* Fit partial sector */
        fp->flag |= FA__DIRTY;
#endif
    }

    if (fp->fptr > fp->fsize) fp->fsize = fp->fptr;        /* Update file size if needed */
    fp->flag |= FA__WRITTEN;                                                /* Set file change flag */

    LEAVE_FF(fp->fs, FR_OK);
}

这个函数里面哪个是判断是否满一个扇区?









回复

使用道具 举报

发表于 2014-5-19 14:34:44 | 显示全部楼层
fatfs的底层代码,过于深入,我们也没做研究。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部