?? comm.h
字號:
#ifndef _COMM_INCLUDED_
#define _COMM_INCLUDED_
//正點原子@scut 08/09/11
//很多部分參考網友的
#define CHAR unsigned char
#define BYTE unsigned char
#define WORD unsigned int
#define DWORD unsigned long
#define MP3_TYPE 0
#define WMA_TYPE 1
#define MID_TYPE 2
#define LRC_TYPE 3
#define TXT_TYPE 4//文本文件
#define MEN_TYPE 5//目錄文件
unsigned long Hzk=0; //零時變量
unsigned long Unit=0;
unsigned long timer=0;//時間計數器
#define Music_Mode 0
#define Ebook_Mode 1
#define Radio_Mode 2
#define Set_Mode 3
#define PREV 104 //向上
#define NEXT 240 //向下
#define CYCL 168 //循環模式
#define QUIT 56 //退出
#define PLAY 248 //播放
#define PLAYOVER 0 //播放結束
bit LYRIC=0; //是否有Lrc文件標志
bit SINGLE=0; //單曲循環標志
bit PLAYING=0;//正在播放標志
unsigned char *menu[4]={"音樂 ","電子書","收音機","其他 "};
uchar MenuOper=0; //菜單記錄
//返回值:對應的類型 0,mp3;1,wma;2,wav,3,mid;4,lrc;5,txt;6,file
flash unsigned char *filetype[7]={"MP3","WMA","WAV","MID","LRC","TXT"," "};
flash unsigned char *hzk12[4]=
{"FONT12 FON",
"UNITOGB BIN",
". ",
".. "
};
unsigned long FAT_MASK;
unsigned int card_size=0;
//簇定義
#define MSDOSFSROOT 0
#define CLUST_FREE 0
#define MSDOSFSFREE CLUST_FREE
#define CLUST_FIRST 2 // 第一個數據簇
#define CLUST_RSRVD 0xfffffff6 // 系統保留簇
#define CLUST_BAD 0xfffffff7 // 壞簇
#define CLUST_EOFS 0xfffffff8 // 第一個結束簇
#define CLUST_EOFE 0xffffffff // 最后一個結束簇
#define FAT12_MASK 0x00000fff // FAT12掩碼
#define FAT16_MASK 0x0000ffff // FAT16掩碼
#define FAT32_MASK 0x0fffffff // FAT32掩碼
// 分區類型
#define PART_TYPE_UNKNOWN 0x00
#define PART_TYPE_FAT12 0x01
#define PART_TYPE_XENIX 0x02
#define PART_TYPE_DOSFAT16 0x04
#define PART_TYPE_EXTDOS 0x05
#define PART_TYPE_FAT16 0x06
#define PART_TYPE_NTFS 0x07
#define PART_TYPE_FAT32 0x0B//11
#define PART_TYPE_FAT32LBA 0x0C
#define PART_TYPE_FAT16LBA 0x0E
#define PART_TYPE_EXTDOSLBA 0x0F
#define PART_TYPE_ONTRACK 0x33
#define PART_TYPE_NOVELL 0x40
#define PART_TYPE_PCIX 0x4B
#define PART_TYPE_PHOENIXSAVE 0xA0
#define PART_TYPE_CPM 0xDB
#define PART_TYPE_DBFS 0xE0
#define PART_TYPE_BBT 0xFF
//目錄要顯示的4行文件名
typedef struct{
unsigned char ShortName[12];//短文件名存儲
unsigned char LongName[52]; //長文件名存儲
unsigned long Clust; //內容的首簇
unsigned long FileLen; //文件長度
unsigned char Type; //文件類型
unsigned int FileIndex; //文件偏移
}MENU_CONECT;
MENU_CONECT m_c[4];
MENU_CONECT CurDir;//記錄當前文件夾信息
//找到的文件信息
typedef struct
{
unsigned long Clust; //當前簇號
unsigned int Nums; //僅FAT12—FAT16中的根目錄區有效
unsigned char Index; //當前的BLOCK中目錄項索引(偏移量)
unsigned long Sector; //當前目錄所在的扇區號
unsigned char NumSector;//決定是否要換簇
}FIND_FILE_INFO;
//記錄第一個分區表的信息
struct partrecord // 16 字節
{
BYTE prIsActive; // 0x80代表該分區為缺省分區
BYTE prStartHead; // 該分區入口的磁頭地址
WORD prStartCylSect; // 該分區入口的扇區地址和柱面地址
BYTE prPartType; // 該分區類型 0b為fat32
BYTE prEndHead; // 該分區結束的扇區地址
WORD prEndCylSect; // 該分區結束的柱面地址
DWORD prStartLBA; // 該分區內第一個扇區地址(DBR所在地址)
DWORD prSize; // 該分區所包含的扇區總數
};
#define BOOTSIG0 0x55//結束標志
#define BOOTSIG1 0xaa
struct partsector
{
CHAR psPartCode[512-64-2]; // 啟動代碼 (446 bytes)
BYTE psPart[64]; // 四個分區表(64 bytes)
BYTE psBootSectSig0; // 兩個簽名(2 bytes)
BYTE psBootSectSig1;
};
//系統引導扇區(DOS BOOT RECORD)DBR結構
//此為磁盤的第一個扇區的數據
#define BOOTSIG2 0
#define BOOTSIG3 0
struct bootsector710 {
BYTE bsJump[3]; // 跳轉指令
CHAR bsOEMName[8]; // 廠商標志和OS版本號
CHAR bsBPB[53]; // BIOS 參數塊 BPB
CHAR bsExt[26]; // 擴展BPB
CHAR bsBootCode[418]; // 引導扇區代碼
BYTE bsBootSectSig2;
BYTE bsBootSectSig3;
BYTE bsBootSectSig0; // 引導扇區簽名0x55
BYTE bsBootSectSig1; // 引導扇區簽名0xAA
};
//bpb信息
// BIOS 參數塊
struct bpb710 {
WORD bpbBytesPerSec; // 每扇區字節數
BYTE bpbSecPerClust; // 每簇扇區數
WORD bpbResSectors; // 保留區域中的保留扇區數+prStartLBA=FAT表所在扇區
BYTE bpbFATs; // FAT表的份數
WORD bpbRootDirEnts; // 根目錄項數
WORD bpbSectors; // 此域為存儲卷上的扇區總數
BYTE bpbMedia; // 固定存儲介質描述
WORD bpbFATsecs; // FAT表所占的扇區數 fat32=0 ,fat16非0
WORD bpbSecPerTrack; // 每道扇區數
WORD bpbHeads; // 磁頭數
DWORD bpbHiddenSecs; // 隱藏扇區數
DWORD bpbHugeSectors; // 總扇區數
DWORD bpbBigFATsecs; // 每個FAT表所占扇區數
WORD bpbExtFlags; // 擴展標志
#define FATNUM 0xf
#define FATMIRROR 0x80
WORD bpbFSVers; // 文件系統版本
#define FSVERS 0
DWORD bpbRootClust; // 根目錄簇號
WORD bpbFSInfo; // 文件系統信息扇區號
WORD bpbBackup; // 備份引導扇區
};
//文件相關屬性
typedef struct {
BYTE deName[8]; // 文件名
#define SLOT_EMPTY 0x00 // 目錄項為空
#define SLOT_E5 0x05
#define SLOT_DELETED 0xe5 // 文件已被刪除
BYTE deExtension[3]; // 擴展名
BYTE deAttributes; // 文件屬性
#define ATTR_NORMAL 0x00 // 讀寫
#define ATTR_READONLY 0x01 // 只讀
#define ATTR_HIDDEN 0x02 // 隱藏
#define ATTR_SYSTEM 0x04 // 系統文件
#define ATTR_VOLUME 0x08 // 卷標文件
#define ATTR_LONG_FILENAME 0x0f // 長文件名文件
#define ATTR_DIRECTORY 0x10 // 子目錄文件
#define ATTR_ARCHIVE 0x20 // 歸檔文件
BYTE deLowerCase; // 系統保留
#define LCASE_BASE 0x08
#define LCASE_EXT 0x10
BYTE deCHundredth; // 文件創建時間的10MS
BYTE deCTime[2]; // 文件創建時間
BYTE deCDate[2]; // 文件創建日期
BYTE deADate[2]; // 文件最近訪問日期
WORD deHighClust; // 文件起始簇號的高16位
BYTE deMTime[2]; // 文件最近修改時間
BYTE deMDate[2]; // 文件最近修改日期
WORD deStartCluster; // 文件起始簇號的低16位
DWORD deFileSize; // 文件長度
}direntry;
// 一個扇區中的目錄項數
#define DIRENTRIES_PER_SECTOR 0x10
// 長文件名入口地址結構
typedef struct
{
BYTE weCnt; //序號
#define WIN_LAST 0x40
#define WIN_CNT 0x3f
BYTE wePart1[10]; //長文件名UNICODE碼(第一部分)
BYTE weAttributes; //長文件名目錄項標志
#define ATTR_WIN95 0x0f
BYTE weReserved1; //系統保留
BYTE weChksum; //校驗值
BYTE wePart2[12]; //長文件名UNICODE碼(第二部分)
WORD weReserved2; //文件開始簇號
BYTE wePart3[4]; //長文件名UNICODE碼(第三部分)
}winentry;
bit ENLRC=0;//是否顯示LRC標志位
typedef struct{
uchar first;
uint t_sec; //暫存歌詞的時間(秒)
uchar t_ms; //保存32MS計數脈沖
ulong Clust; //歌詞文件的當前簇號
uchar so; //緩沖區內的偏移(0-7)
uchar sl; //簇內扇區偏移(0 -- (SectorsPerCluster-1))
uint wl; //扇內偏移(0-511)
//當前文件指針 (fatClustToSect(Clust)+sl)*512+wl*32
uint filelen; //歌詞文件的余下的長度
}LYRIC_STRUCT;
LYRIC_STRUCT lyric; //歌詞信息
//定義fat根目錄的起始位置
typedef union
{
unsigned long Sector; //FAT12&FAT16有效
unsigned long Clust; //FAT32時有效
}ROOTDIR_INF;
ROOTDIR_INF RootDir; //目錄區
//fat 特性自定義
#define FAT16 1
#define FAT32 2
#define WIN_CHARS 13 //長文件名入口地址結構可包含13個字符
//在FAT32中,文件名最長可到255個字符
#define WIN_MAXLEN 255
// 目錄或文件入口地址結構中的時間結構
#define DT_2SECONDS_MASK 0x1F // 秒
#define DT_2SECONDS_SHIFT 0
#define DT_MINUTES_MASK 0x7E0 // 分
#define DT_MINUTES_SHIFT 5
#define DT_HOURS_MASK 0xF800 // 時
#define DT_HOURS_SHIFT 11
// 目錄或文件入口地址結構中的日期結構
#define DD_DAY_MASK 0x1F // 日
#define DD_DAY_SHIFT 0
#define DD_MONTH_MASK 0x1E0 // 月
#define DD_MONTH_SHIFT 5
#define DD_YEAR_MASK 0xFE00 // 年 - 1980
#define DD_YEAR_SHIFT 9
// 調可函數
void ReadBlock(unsigned long LBA);
unsigned long fatClustToSect(unsigned long clust);
unsigned char fatInit( void);
unsigned int fatClusterSize(void);
unsigned long fatNextCluster(unsigned long cluster);
extern uchar BUFFER[512];
uchar pbuffer[512];
//unsigned char LONGNAME_BUFFER_ADDR[52];//長文件名緩存
unsigned int RootDirEnts; //根目錄總的項數(FAT12&FAT16)
unsigned char FatType; //0:FAT12 1:FAT16 2:FAT32
//unsigned char DIRNAME_BUFFER_ADDR[30];
//unsigned char *LongNameBuffer =(unsigned char *) LONGNAME_BUFFER_ADDR;
//unsigned char *DirNameBuffer = (unsigned char *) DIRNAME_BUFFER_ADDR;
struct partrecord PartInfo;
unsigned char Fat32Enabled;
unsigned long FirstDataSector; //數據區開始扇區
unsigned int BytesPerSector; //每扇區字節數
unsigned int SectorsPerCluster;//每簇扇區數
unsigned long FirstFATSector; //fat表所在的扇區
unsigned long FirstDirSector; //根目錄所在的扇區
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -