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

📄 sd_lib.lss

📁 实现了avr下对sd卡的读写,支持文件存取,删除的功能
💻 LSS
📖 第 1 页 / 共 5 页
字号:
     82e:	a1 f3       	breq	.-24     	; 0x818 <GetEmptyDIR+0x3a>
     830:	98 f3       	brcs	.-26     	; 0x818 <GetEmptyDIR+0x3a>
     832:	08 94       	sec
     834:	e1 1c       	adc	r14, r1
     836:	f1 1c       	adc	r15, r1
     838:	21 96       	adiw	r28, 0x01	; 1
     83a:	ec 14       	cp	r14, r12
     83c:	fd 04       	cpc	r15, r13
     83e:	18 f3       	brcs	.-58     	; 0x806 <GetEmptyDIR+0x28>
		}
	}
	return ID;
}
     840:	c8 01       	movw	r24, r16
     842:	df 91       	pop	r29
     844:	cf 91       	pop	r28
     846:	1f 91       	pop	r17
     848:	0f 91       	pop	r16
     84a:	ff 90       	pop	r15
     84c:	ef 90       	pop	r14
     84e:	df 90       	pop	r13
     850:	cf 90       	pop	r12
     852:	08 95       	ret

00000854 <GetFileID>:
//-------------------------------------------------------------------------
//获得和文件名对应的目录
uint8_t GetFileID(uint8_t Name[11],DIR *ID,uint16_t *pIndex){
     854:	6f 92       	push	r6
     856:	7f 92       	push	r7
     858:	8f 92       	push	r8
     85a:	9f 92       	push	r9
     85c:	af 92       	push	r10
     85e:	bf 92       	push	r11
     860:	cf 92       	push	r12
     862:	df 92       	push	r13
     864:	ef 92       	push	r14
     866:	ff 92       	push	r15
     868:	0f 93       	push	r16
     86a:	1f 93       	push	r17
     86c:	cf 93       	push	r28
     86e:	df 93       	push	r29
     870:	4c 01       	movw	r8, r24
     872:	3b 01       	movw	r6, r22
     874:	7a 01       	movw	r14, r20
	uint16_t  i,DirSecCut,DirStart,m;
	
	DirSecCut = GetDirSecCount();//////目录项占用的扇区数
     876:	0e 94 5d 03 	call	0x6ba <GetDirSecCount>
     87a:	5c 01       	movw	r10, r24
	DirStart = DirStartSec();
     87c:	0e 94 43 03 	call	0x686 <DirStartSec>
	for(i=0,*pIndex=0;i<DirSecCut;i++){
     880:	cc 24       	eor	r12, r12
     882:	dd 24       	eor	r13, r13
     884:	f7 01       	movw	r30, r14
     886:	d1 82       	std	Z+1, r13	; 0x01
     888:	c0 82       	st	Z, r12
     88a:	ca 14       	cp	r12, r10
     88c:	db 04       	cpc	r13, r11
     88e:	70 f5       	brcc	.+92     	; 0x8ec <__stack+0x8d>
     890:	8b 01       	movw	r16, r22
		ReadFatBlock(DirStart+i);
     892:	c8 01       	movw	r24, r16
     894:	aa 27       	eor	r26, r26
     896:	bb 27       	eor	r27, r27
     898:	bc 01       	movw	r22, r24
     89a:	cd 01       	movw	r24, r26
     89c:	0e 94 9c 02 	call	0x538 <ReadFatBlock>
     8a0:	c2 eb       	ldi	r28, 0xB2	; 178
     8a2:	d0 e0       	ldi	r29, 0x00	; 0
		for(m=0;m<16;m++){
			if(IsEqual(Name,(uint8_t *)&((DIR*)&BUFFER[m*32])->FileName,11)){//isequal内存比较函数 , name和filename的 头指针,长度传进去即可 
     8a4:	4b e0       	ldi	r20, 0x0B	; 11
     8a6:	be 01       	movw	r22, r28
     8a8:	c4 01       	movw	r24, r8
     8aa:	0e 94 c3 02 	call	0x586 <IsEqual>
     8ae:	88 23       	and	r24, r24
     8b0:	49 f0       	breq	.+18     	; 0x8c4 <__stack+0x65>
				*ID = *((DIR*)&BUFFER[m*32]);//如果成立,就把id取出 
     8b2:	80 e2       	ldi	r24, 0x20	; 32
     8b4:	f3 01       	movw	r30, r6
     8b6:	09 90       	ld	r0, Y+
     8b8:	01 92       	st	Z+, r0
     8ba:	8a 95       	dec	r24
     8bc:	e1 f7       	brne	.-8      	; 0x8b6 <__stack+0x57>
				return 1; 						//找到对应的目录项,返回1.
     8be:	81 e0       	ldi	r24, 0x01	; 1
     8c0:	90 e0       	ldi	r25, 0x00	; 0
     8c2:	16 c0       	rjmp	.+44     	; 0x8f0 <__stack+0x91>
			}
			(*pIndex)++;//记录下第几块扇区 
     8c4:	f7 01       	movw	r30, r14
     8c6:	80 81       	ld	r24, Z
     8c8:	91 81       	ldd	r25, Z+1	; 0x01
     8ca:	01 96       	adiw	r24, 0x01	; 1
     8cc:	91 83       	std	Z+1, r25	; 0x01
     8ce:	80 83       	st	Z, r24
     8d0:	a0 96       	adiw	r28, 0x20	; 32
     8d2:	f2 e0       	ldi	r31, 0x02	; 2
     8d4:	c2 39       	cpi	r28, 0x92	; 146
     8d6:	df 07       	cpc	r29, r31
     8d8:	29 f3       	breq	.-54     	; 0x8a4 <__stack+0x45>
     8da:	20 f3       	brcs	.-56     	; 0x8a4 <__stack+0x45>
     8dc:	08 94       	sec
     8de:	c1 1c       	adc	r12, r1
     8e0:	d1 1c       	adc	r13, r1
     8e2:	0f 5f       	subi	r16, 0xFF	; 255
     8e4:	1f 4f       	sbci	r17, 0xFF	; 255
     8e6:	ca 14       	cp	r12, r10
     8e8:	db 04       	cpc	r13, r11
     8ea:	98 f2       	brcs	.-90     	; 0x892 <__stack+0x33>
		}
	}
	return 0; 									//没有找到对应的目录项,返回0.
     8ec:	80 e0       	ldi	r24, 0x00	; 0
     8ee:	90 e0       	ldi	r25, 0x00	; 0
     8f0:	df 91       	pop	r29
     8f2:	cf 91       	pop	r28
     8f4:	1f 91       	pop	r17
     8f6:	0f 91       	pop	r16
     8f8:	ff 90       	pop	r15
     8fa:	ef 90       	pop	r14
     8fc:	df 90       	pop	r13
     8fe:	cf 90       	pop	r12
     900:	bf 90       	pop	r11
     902:	af 90       	pop	r10
     904:	9f 90       	pop	r9
     906:	8f 90       	pop	r8
     908:	7f 90       	pop	r7
     90a:	6f 90       	pop	r6
     90c:	08 95       	ret

0000090e <GetNextFAT>:
}
//-------------------------------------------------------------------------
uint16_t GetNextFAT(void){							//获取一个空的FAT项
     90e:	0f 93       	push	r16
     910:	1f 93       	push	r17
     912:	cf 93       	push	r28
     914:	df 93       	push	r29
	uint16_t FAT_Count,i;
	FAT_Count=BPB_FATSz16*256; 						//FAT表总项数
     916:	80 91 ac 00 	lds	r24, 0x00AC
     91a:	90 91 ad 00 	lds	r25, 0x00AD
     91e:	18 2f       	mov	r17, r24
     920:	00 27       	eor	r16, r16
	for(i=0;i<FAT_Count;i++){
     922:	c0 e0       	ldi	r28, 0x00	; 0
     924:	d0 e0       	ldi	r29, 0x00	; 0
     926:	c0 17       	cp	r28, r16
     928:	d1 07       	cpc	r29, r17
     92a:	48 f4       	brcc	.+18     	; 0x93e <GetNextFAT+0x30>
		if(ReadFAT(i)==0)return i;
     92c:	ce 01       	movw	r24, r28
     92e:	0e 94 a5 03 	call	0x74a <ReadFAT>
     932:	89 2b       	or	r24, r25
     934:	11 f4       	brne	.+4      	; 0x93a <GetNextFAT+0x2c>
     936:	ce 01       	movw	r24, r28
     938:	04 c0       	rjmp	.+8      	; 0x942 <GetNextFAT+0x34>
     93a:	21 96       	adiw	r28, 0x01	; 1
     93c:	f4 cf       	rjmp	.-24     	; 0x926 <GetNextFAT+0x18>
	}
	return 0;
     93e:	80 e0       	ldi	r24, 0x00	; 0
     940:	90 e0       	ldi	r25, 0x00	; 0
     942:	df 91       	pop	r29
     944:	cf 91       	pop	r28
     946:	1f 91       	pop	r17
     948:	0f 91       	pop	r16
     94a:	08 95       	ret

0000094c <ReadDIR>:
}
//-------------------------------------------------------------------------
void ReadDIR(uint16_t Index, DIR* Value){			//读取根目录的指定项
     94c:	ef 92       	push	r14
     94e:	ff 92       	push	r15
     950:	0f 93       	push	r16
     952:	1f 93       	push	r17
     954:	8c 01       	movw	r16, r24
     956:	7b 01       	movw	r14, r22
	uint32_t LBA = DirStartSec()+Index/16;//index的最大模值是16
     958:	0e 94 43 03 	call	0x686 <DirStartSec>
     95c:	9b 01       	movw	r18, r22
     95e:	ac 01       	movw	r20, r24
     960:	c8 01       	movw	r24, r16
     962:	f4 e0       	ldi	r31, 0x04	; 4
     964:	96 95       	lsr	r25
     966:	87 95       	ror	r24
     968:	fa 95       	dec	r31
     96a:	e1 f7       	brne	.-8      	; 0x964 <ReadDIR+0x18>
     96c:	aa 27       	eor	r26, r26
     96e:	bb 27       	eor	r27, r27
     970:	82 0f       	add	r24, r18
     972:	93 1f       	adc	r25, r19
     974:	a4 1f       	adc	r26, r20
     976:	b5 1f       	adc	r27, r21
	ReadFatBlock(LBA);
     978:	bc 01       	movw	r22, r24
     97a:	cd 01       	movw	r24, r26
     97c:	0e 94 9c 02 	call	0x538 <ReadFatBlock>
	CopyBytes((uint8_t *)&BUFFER[(Index%16)*32],(uint8_t *)Value,32);//把32个字节长度都copy下来,注意都要从512byte的缓冲区里copy出来,不然系统资源不够用
     980:	0f 70       	andi	r16, 0x0F	; 15
     982:	10 70       	andi	r17, 0x00	; 0
     984:	e5 e0       	ldi	r30, 0x05	; 5
     986:	00 0f       	add	r16, r16
     988:	11 1f       	adc	r17, r17
     98a:	ea 95       	dec	r30
     98c:	e1 f7       	brne	.-8      	; 0x986 <ReadDIR+0x3a>
     98e:	40 e2       	ldi	r20, 0x20	; 32
     990:	50 e0       	ldi	r21, 0x00	; 0
     992:	b7 01       	movw	r22, r14
     994:	c8 01       	movw	r24, r16
     996:	8e 54       	subi	r24, 0x4E	; 78
     998:	9f 4f       	sbci	r25, 0xFF	; 255
     99a:	0e 94 b8 02 	call	0x570 <CopyBytes>
     99e:	1f 91       	pop	r17
     9a0:	0f 91       	pop	r16
     9a2:	ff 90       	pop	r15
     9a4:	ef 90       	pop	r14
     9a6:	08 95       	ret

000009a8 <WriteDIR>:
}
//-------------------------------------------------------------------------
void WriteDIR(uint16_t Index, DIR* Value){			//写根目录的指定项
     9a8:	af 92       	push	r10
     9aa:	bf 92       	push	r11
     9ac:	cf 92       	push	r12
     9ae:	df 92       	push	r13
     9b0:	ef 92       	push	r14
     9b2:	ff 92       	push	r15
     9b4:	0f 93       	push	r16
     9b6:	1f 93       	push	r17
     9b8:	8c 01       	movw	r16, r24
     9ba:	5b 01       	movw	r10, r22
	uint32_t LBA = DirStartSec()+Index/16;
     9bc:	0e 94 43 03 	call	0x686 <DirStartSec>
     9c0:	6b 01       	movw	r12, r22
     9c2:	7c 01       	movw	r14, r24
     9c4:	c8 01       	movw	r24, r16
     9c6:	b4 e0       	ldi	r27, 0x04	; 4
     9c8:	96 95       	lsr	r25
     9ca:	87 95       	ror	r24
     9cc:	ba 95       	dec	r27
     9ce:	e1 f7       	brne	.-8      	; 0x9c8 <WriteDIR+0x20>
     9d0:	aa 27       	eor	r26, r26
     9d2:	bb 27       	eor	r27, r27
     9d4:	c8 0e       	add	r12, r24
     9d6:	d9 1e       	adc	r13, r25
     9d8:	ea 1e       	adc	r14, r26
     9da:	fb 1e       	adc	r15, r27
	ReadFatBlock(LBA);
     9dc:	c7 01       	movw	r24, r14
     9de:	b6 01       	movw	r22, r12
     9e0:	0e 94 9c 02 	call	0x538 <ReadFatBlock>
	CopyBytes((uint8_t *)Value,(uint8_t *)&BUFFER[(Index%16)*32],32);
     9e4:	0f 70       	andi	r16, 0x0F	; 15
     9e6:	10 70       	andi	r17, 0x00	; 0
     9e8:	a5 e0       	ldi	r26, 0x05	; 5
     9ea:	00 0f       	add	r16, r16
     9ec:	11 1f       	adc	r17, r17
     9ee:	aa 95       	dec	r26
     9f0:	e1 f7       	brne	.-8      	; 0x9ea <WriteDIR+0x42>
     9f2:	0e 54       	subi	r16, 0x4E	; 78
     9f4:	1f 4f       	sbci	r17, 0xFF	; 255
     9f6:	40 e2       	ldi	r20, 0x20	; 32
     9f8:	50 e0       	ldi	r21, 0x00	; 0
     9fa:	b8 01       	movw	r22, r16
     9fc:	c5 01       	movw	r24, r10
     9fe:	0e 94 b8 02 	call	0x570 <CopyBytes>
	WriteFatBlock(LBA);
     a02:	c7 01       	movw	r24, r14
     a04:	b6 01       	movw	r22, r12
     a06:	0e 94 aa 02 	call	0x554 <WriteFatBlock>
     a0a:	1f 91       	pop	r17
     a0c:	0f 91       	pop	r16
     a0e:	ff 90       	pop	r15
     a10:	ef 90       	pop	r14
     a12:	df 90       	pop	r13
     a14:	cf 90       	pop	r12
     a16:	bf 90       	pop	r11
     a18:	af 90       	pop	r10
     a1a:	08 95       	ret

00000a1c <CopyFAT>:
}
//-------------------------------------------------------------------------
void CopyFAT(void){						//复制文件分配表,使其和备份一致
     a1c:	cf 93       	push	r28
     a1e:	df 93       	push	r29
	uint16_t i;

	for(i=0;i<BPB_FATSz16;i++){
     a20:	c0 e0       	ldi	r28, 0x00	; 0
     a22:	d0 e0       	ldi	r29, 0x00	; 0
     a24:	80 91 ac 00 	lds	r24, 0x00AC
     a28:	90 91 ad 00 	lds	r25, 0x00AD
     a2c:	c8 17       	cp	r28, r24
     a2e:	d9 07       	cpc	r29, r25
     a30:	30 f5       	brcc	.+76     	; 0xa7e <CopyFAT+0x62>
		ReadFatBlock(BPB_RsvdSecCnt+i);
     a32:	80 91 b2 02 	lds	r24, 0x02B2
     a36:	90 91 b3 02 	lds	r25, 0x02B3
     a3a:	8c 0f       	add	r24, r28
     a3c:	9d 1f       	adc	r25, r29
     a3e:	aa 27       	eor	r26, r26
     a40:	bb 27       	eor	r27, r27
     a42:	bc 01       	movw	r22, r24
     a44:	cd 01       	movw	r24, r26
     a46:	0e 94 9c 02 	call	0x538 <ReadFatBlock>
		WriteFatBlock(BPB_RsvdSecCnt+BPB_FATSz16+i);
     a4a:	80 91 b2 02 	lds	r24, 0x02B2
     a4e:	90 91 b3 02 	lds	r25, 0x02B3
     a52:	20 91 ac 00 	lds	r18, 0x00AC
     a56:	30 91 ad 00 	lds	r19, 0x00AD
     a5a:	82 0f       	add	r24, r18
     a5c:	93 1f       	adc	r25, r19
     a5e:	8c 0f       	add	r24, r28
     a60:	9d 1f       	adc	r25, r29
     a62:	aa 27       	eor	r26, r26
     a64:	bb 27       	eor	r27, r27
     a66:	bc 01       	movw	r22, r24
     a68:	cd 01       	movw	r24, r26
     a6a:	0e 94 aa 02 	call	0x554 <WriteFatBlock>
     a6e:	21 96       	adiw	r28, 0x01	; 1
     a70:	80 91 ac 00 	lds	r24, 0x00AC
     a74:	90 91 ad 00 	lds	r25, 0x00AD
     a78:	c8 17       	cp	r28, r24
     a7a:	d9 07       	cpc	r29, r25
     a7c:	d0 f2       	brcs	.-76     	; 0xa32 <CopyFAT+0x16>
     a7e:	df 91       	pop	r29
     a80:	cf 91       	pop	r28
 

⌨️ 快捷键说明

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