⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdfs_out.lst

📁 基于SD卡的FAT文件系统
💻 LST
📖 第 1 页 / 共 5 页
字号:
	return FR_RW_ERROR;
}




#if !_FS_READONLY
/*-----------------------------------------------------------------------*/
/* 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 */
)
{
	DWORD sect;
	UINT wcnt, cc;
	CLUST clust;
	FRESULT res;
	const BYTE *wbuff = buff;
	FATFS *fs = fp->fs;


	*bw = 0;
	res = validate(fs, fp->id);						/* Check validity of the object */
	if (res != FR_OK) return res;
	if (fp->flag & FA__ERROR) return FR_RW_ERROR;	/* Check error flag */
	if (!(fp->flag & FA_WRITE)) return FR_DENIED;	/* Check access mode */
	if (fp->fsize + btw < fp->fsize) return FR_OK;	/* File size cannot reach 4GB */

	for ( ;  btw;									/* Repeat until all data transferred */
		wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt) {
		if ((fp->fptr % 512) == 0) {				/* On the sector boundary */
			if (--(fp->sect_clust)) {				/* Decrement left sector counter */
				sect = fp->curr_sect + 1;			/* Get current sector */
			} else {								/* On the cluster boundary, get next cluster */
				if (fp->fptr == 0) {				/* Is top of the file */
					clust = fp->org_clust;
					if (clust == 0)					/* No cluster is created yet */
						fp->org_clust = clust = create_chain(0);	/* Create a new cluster chain */
				} else {							/* Middle or end of file */
					clust = create_chain(fp->curr_clust);			/* Trace or streach cluster chain */
				}
				if (clust == 0) break;				/* Disk full */
				if (clust == 1 || clust >= fs->max_clust) goto fw_error;
				fp->curr_clust = clust;				/* Current cluster */
				sect = clust2sect(clust);			/* Get current sector */
				fp->sect_clust = fs->sects_clust;	/* Re-initialize the left sector counter */
			}
			fp->curr_sect = sect;					/* Update current sector */
			cc = btw / 512;							/* When left bytes >= 512, */
			if (cc) {								/* Write maximum contiguous sectors directly */
				if (cc > fp->sect_clust) cc = fp->sect_clust;
				if (disk_write(0, wbuff, sect, (BYTE)cc) != RES_OK)
					goto fw_error;
				fp->sect_clust -= (BYTE)(cc - 1);
				fp->curr_sect += cc - 1;
				wcnt = cc * 512;
				continue;
			}
			if (fp->fptr >= fp->fsize) {			/* Flush R/W window if needed */
				if (!move_window(0)) goto fw_error;
				fs->winsect = fp->curr_sect;
			}
		}
		if (!move_window(fp->curr_sect))			/* Move sector window */
			goto fw_error;
		wcnt = 512 - (WORD)(fp->fptr % 512);		/* Copy fractional bytes bytes to sector window */
		if (wcnt > btw) wcnt = btw;
		memcpy(&fs->win[(WORD)fp->fptr % 512], wbuff, wcnt);
		fs->winflag = 1;
	}

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

fw_error:	/* Abort this function due to an unrecoverable error */
	fp->flag |= FA__ERROR;
	return FR_RW_ERROR;
}




/*-----------------------------------------------------------------------*/
/* Synchronize the file object                                           */
/*-----------------------------------------------------------------------*/

FRESULT f_sync (
	FIL *fp		/* Pointer to the file object */
)
{
	DWORD tim;
	BYTE *dir;
	FRESULT res;
	FATFS *fs = fp->fs;


	res = validate(fs, fp->id);				/* Check validity of the object */
	if (res == FR_OK) {
		if (fp->flag & FA__WRITTEN) {		/* Has the file been written? */
			/* Update the directory entry */
			if (!move_window(fp->dir_sect))
				return FR_RW_ERROR;
			dir = fp->dir_ptr;
			dir[DIR_Attr] |= AM_ARC;						/* Set archive bit */
			ST_DWORD(&dir[DIR_FileSize], fp->fsize);		/* Update file size */
			ST_WORD(&dir[DIR_FstClusLO], fp->org_clust);	/* Update start cluster */
#if _FAT32
			ST_WORD(&dir[DIR_FstClusHI], fp->org_clust >> 16);
#endif
			tim = get_fattime();					/* Updated time */
			ST_DWORD(&dir[DIR_WrtTime], tim);
			fp->flag &= ~FA__WRITTEN;
			res = sync();
		}
	}
	return res;
}

#endif /* !_FS_READONLY */




/*-----------------------------------------------------------------------*/
/* Close File                                                            */
/*-----------------------------------------------------------------------*/

FRESULT f_close (
	FIL *fp		/* Pointer to the file object to be closed */
)
{
     28a:	cf 93       	push	r28
     28c:	df 93       	push	r29
     28e:	ec 01       	movw	r28, r24
	FRESULT res;


#if !_FS_READONLY
	res = f_sync(fp);
#else
	res = validate(fp->fs, fp->id);
     290:	68 81       	ld	r22, Y
     292:	79 81       	ldd	r23, Y+1	; 0x01
     294:	8c 81       	ldd	r24, Y+4	; 0x04
     296:	9d 81       	ldd	r25, Y+5	; 0x05
     298:	0e 94 33 01 	call	0x266	; 0x266 <validate>
#endif
	if (res == FR_OK)
     29c:	00 97       	sbiw	r24, 0x00	; 0
     29e:	11 f4       	brne	.+4      	; 0x2a4 <f_close+0x1a>
		fp->fs = NULL;
     2a0:	1d 82       	std	Y+5, r1	; 0x05
     2a2:	1c 82       	std	Y+4, r1	; 0x04
     2a4:	df 91       	pop	r29
     2a6:	cf 91       	pop	r28
     2a8:	08 95       	ret

000002aa <move_window>:
     2aa:	cf 92       	push	r12
     2ac:	df 92       	push	r13
     2ae:	ef 92       	push	r14
     2b0:	ff 92       	push	r15
     2b2:	0f 93       	push	r16
     2b4:	cf 93       	push	r28
     2b6:	df 93       	push	r29
     2b8:	6b 01       	movw	r12, r22
     2ba:	7c 01       	movw	r14, r24
     2bc:	c0 91 6d 00 	lds	r28, 0x006D
     2c0:	d0 91 6e 00 	lds	r29, 0x006E
     2c4:	8c 81       	ldd	r24, Y+4	; 0x04
     2c6:	9d 81       	ldd	r25, Y+5	; 0x05
     2c8:	ae 81       	ldd	r26, Y+6	; 0x06
     2ca:	bf 81       	ldd	r27, Y+7	; 0x07
     2cc:	8c 15       	cp	r24, r12
     2ce:	9d 05       	cpc	r25, r13
     2d0:	ae 05       	cpc	r26, r14
     2d2:	bf 05       	cpc	r27, r15
     2d4:	b9 f0       	breq	.+46     	; 0x304 <move_window+0x5a>
     2d6:	c1 14       	cp	r12, r1
     2d8:	d1 04       	cpc	r13, r1
     2da:	e1 04       	cpc	r14, r1
     2dc:	f1 04       	cpc	r15, r1
     2de:	91 f0       	breq	.+36     	; 0x304 <move_window+0x5a>
     2e0:	be 01       	movw	r22, r28
     2e2:	60 5e       	subi	r22, 0xE0	; 224
     2e4:	7f 4f       	sbci	r23, 0xFF	; 255
     2e6:	01 e0       	ldi	r16, 0x01	; 1
     2e8:	a7 01       	movw	r20, r14
     2ea:	96 01       	movw	r18, r12
     2ec:	80 e0       	ldi	r24, 0x00	; 0
     2ee:	0e 94 90 07 	call	0xf20	; 0xf20 <disk_read>
     2f2:	89 2b       	or	r24, r25
     2f4:	19 f0       	breq	.+6      	; 0x2fc <move_window+0x52>
     2f6:	80 e0       	ldi	r24, 0x00	; 0
     2f8:	90 e0       	ldi	r25, 0x00	; 0
     2fa:	06 c0       	rjmp	.+12     	; 0x308 <move_window+0x5e>
     2fc:	cc 82       	std	Y+4, r12	; 0x04
     2fe:	dd 82       	std	Y+5, r13	; 0x05
     300:	ee 82       	std	Y+6, r14	; 0x06
     302:	ff 82       	std	Y+7, r15	; 0x07
     304:	81 e0       	ldi	r24, 0x01	; 1
     306:	90 e0       	ldi	r25, 0x00	; 0
     308:	df 91       	pop	r29
     30a:	cf 91       	pop	r28
     30c:	0f 91       	pop	r16
     30e:	ff 90       	pop	r15
     310:	ef 90       	pop	r14
     312:	df 90       	pop	r13
     314:	cf 90       	pop	r12
     316:	08 95       	ret

00000318 <get_cluster>:
     318:	a0 e0       	ldi	r26, 0x00	; 0
     31a:	b0 e0       	ldi	r27, 0x00	; 0
     31c:	e2 e9       	ldi	r30, 0x92	; 146
     31e:	f1 e0       	ldi	r31, 0x01	; 1
     320:	0c 94 22 0b 	jmp	0x1644	; 0x1644 <__prologue_saves__+0xa>
     324:	5b 01       	movw	r10, r22
     326:	6c 01       	movw	r12, r24
     328:	80 90 6d 00 	lds	r8, 0x006D
     32c:	90 90 6e 00 	lds	r9, 0x006E
     330:	62 30       	cpi	r22, 0x02	; 2
     332:	71 05       	cpc	r23, r1
     334:	81 05       	cpc	r24, r1
     336:	91 05       	cpc	r25, r1
     338:	08 f4       	brcc	.+2      	; 0x33c <get_cluster+0x24>
     33a:	9f c0       	rjmp	.+318    	; 0x47a <__stack+0x1b>
     33c:	f4 01       	movw	r30, r8
     33e:	80 8d       	ldd	r24, Z+24	; 0x18
     340:	91 8d       	ldd	r25, Z+25	; 0x19
     342:	a2 8d       	ldd	r26, Z+26	; 0x1a
     344:	b3 8d       	ldd	r27, Z+27	; 0x1b
     346:	a8 16       	cp	r10, r24
     348:	b9 06       	cpc	r11, r25
     34a:	ca 06       	cpc	r12, r26
     34c:	db 06       	cpc	r13, r27
     34e:	08 f0       	brcs	.+2      	; 0x352 <get_cluster+0x3a>
     350:	94 c0       	rjmp	.+296    	; 0x47a <__stack+0x1b>
     352:	e0 84       	ldd	r14, Z+8	; 0x08
     354:	f1 84       	ldd	r15, Z+9	; 0x09
     356:	02 85       	ldd	r16, Z+10	; 0x0a
     358:	13 85       	ldd	r17, Z+11	; 0x0b
     35a:	84 8d       	ldd	r24, Z+28	; 0x1c
     35c:	82 30       	cpi	r24, 0x02	; 2
     35e:	09 f4       	brne	.+2      	; 0x362 <get_cluster+0x4a>
     360:	4e c0       	rjmp	.+156    	; 0x3fe <get_cluster+0xe6>
     362:	83 30       	cpi	r24, 0x03	; 3
     364:	09 f4       	brne	.+2      	; 0x368 <get_cluster+0x50>
     366:	67 c0       	rjmp	.+206    	; 0x436 <get_cluster+0x11e>
     368:	81 30       	cpi	r24, 0x01	; 1
     36a:	09 f0       	breq	.+2      	; 0x36e <get_cluster+0x56>
     36c:	86 c0       	rjmp	.+268    	; 0x47a <__stack+0x1b>
     36e:	e5 01       	movw	r28, r10
     370:	cc 0f       	add	r28, r28
     372:	dd 1f       	adc	r29, r29
     374:	ca 0d       	add	r28, r10
     376:	db 1d       	adc	r29, r11
     378:	d6 95       	lsr	r29
     37a:	c7 95       	ror	r28
     37c:	be 01       	movw	r22, r28
     37e:	67 2f       	mov	r22, r23
     380:	77 27       	eor	r23, r23
     382:	66 95       	lsr	r22
     384:	88 27       	eor	r24, r24
     386:	99 27       	eor	r25, r25
     388:	6e 0d       	add	r22, r14
     38a:	7f 1d       	adc	r23, r15
     38c:	80 1f       	adc	r24, r16
     38e:	91 1f       	adc	r25, r17
     390:	0e 94 55 01 	call	0x2aa	; 0x2aa <move_window>
     394:	89 2b       	or	r24, r25
     396:	09 f4       	brne	.+2      	; 0x39a <get_cluster+0x82>
     398:	70 c0       	rjmp	.+224    	; 0x47a <__stack+0x1b>
     39a:	fe 01       	movw	r30, r28
     39c:	f1 70       	andi	r31, 0x01	; 1
     39e:	e8 0d       	add	r30, r8
     3a0:	f9 1d       	adc	r31, r9
     3a2:	70 a0       	ldd	r7, Z+32	; 0x20
     3a4:	21 96       	adiw	r28, 0x01	; 1
     3a6:	ce 01       	movw	r24, r28
     3a8:	89 2f       	mov	r24, r25
     3aa:	99 27       	eor	r25, r25
     3ac:	86 95       	lsr	r24
     3ae:	aa 27       	eor	r26, r26
     3b0:	bb 27       	eor	r27, r27
     3b2:	e8 0e       	add	r14, r24
     3b4:	f9 1e       	adc	r15, r25
     3b6:	0a 1f       	adc	r16, r26
     3b8:	1b 1f       	adc	r17, r27
     3ba:	c8 01       	movw	r24, r16
     3bc:	b7 01       	movw	r22, r14
     3be:	0e 94 55 01 	call	0x2aa	; 0x2aa <move_window>
     3c2:	89 2b       	or	r24, r25
     3c4:	09 f4       	brne	.+2      	; 0x3c8 <get_cluster+0xb0>
     3c6:	59 c0       	rjmp	.+178    	; 0x47a <__stack+0x1b>
     3c8:	67 2d       	mov	r22, r7
     3ca:	77 27       	eor	r23, r23
     3cc:	d1 70       	andi	r29, 0x01	; 1
     3ce:	c8 0d       	add	r28, r8
     3d0:	d9 1d       	adc	r29, r9
     3d2:	88 a1       	ldd	r24, Y+32	; 0x20
     3d4:	99 27       	eor	r25, r25
     3d6:	98 2f       	mov	r25, r24
     3d8:	88 27       	eor	r24, r24
     3da:	68 2b       	or	r22, r24
     3dc:	79 2b       	or	r23, r25
     3de:	a0 fe       	sbrs	r10, 0
     3e0:	08 c0       	rjmp	.+16     	; 0x3f2 <get_cluster+0xda>
     3e2:	e4 e0       	ldi	r30, 0x04	; 4
     3e4:	76 95       	lsr	r23
     3e6:	67 95       	ror	r22
     3e8:	ea 95       	dec	r30
     3ea:	e1 f7       	brne	.-8      	; 0x3e4 <get_cluster+0xcc>
     3ec:	88 27       	eor	r24, r24
     3ee:	99 27       	eor	r25, r25
     3f0:	48 c0       	rjmp	.+144    	; 0x482 <__stack+0x23>
     3f2:	88 27       	eor	r24, r24
     3f4:	99 27       	eor	r25, r25
     3f6:	7f 70       	andi	r23, 0x0F	; 15
     3f8:	80 70       	andi	r24, 0x00	; 0
     3fa:	90 70       	andi	r25, 0x00	; 0
     3fc:	42 c0       	rjmp	.+132    	; 0x482 <__stack+0x23>
     3fe:	bb 27       	eor	r27, r27
     400:	ad 2d       	mov	r26, r13
     402:	9c 2d       	mov	r25, r12
     404:	8b 2d       	mov	r24, r11
     406:	e8 0e       	add	r14, r24
     408:	f9 1e       	adc	r15, r25
     40a:	0a 1f       	adc	r16, r26
     40c:	1b 1f       	adc	r17, r27
     40e:	c8 01       	movw	r24, r16
     410:	b7 01       	movw	r22, r14
     412:	0e 94 55 01 	call	0x2aa	; 0x2aa <move_window>
     416:	89 2b       	or	r24, r25
     418:	81 f1       	breq	.+96     	; 0x47a <__stack+0x1b>
     41a:	c5 01       	movw	r24, r10
     41c:	88 0f       	add	r24, r24
     41e:	99 1f       	adc	r25, r25
     420:	91 70       	andi	r25, 0x01	; 1
     422:	88 0e       	add	r8, r24
     424:	99 1e       	adc	r9, r25
     426:	f4 01       	movw	r30, r8
     428:	80 a1       	ldd	r24, Z+32	; 0x20
     42a:	91 a1       	ldd	r25, Z+33	; 0x21
     42c:	9c 01       	movw	r18, r24
     42e:	b9 01       	movw	r22, r18
     430:	88 27       	eor	r24, r24
     432:	99 27       	eor	r25, r25
     434:	26 c0       	rjmp	.+76     	; 0x482 <__stack+0x23>
     436:	d6 01       	movw	r26, r12
     438:	c5 01       	movw	r24, r10
     43a:	37 e0       	ldi	r19, 0x07	; 7
     43c:	b6 95       	lsr	r27
     43e:	a7 95       	ror	r26
     440:	97 95       	ror	r25

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -