uÅ̶Áд¿ØÖÆÔ´³ÌÐò - ch376оƬ ÏÂÔØ±¾ÎÄ

Ö÷Òª°üº¬4¸öCÎļþºÍºÍÈý¸öÍ·Îļþ CH376INC.H ÓëCH376HFT.CΪuÅÌÖ÷Îļþ SPI_SW.C Ϊ¶ÔÓ²¼þ²Ù×÷Îļþ µ¥Æ¬»úÓëSPI½Ó¿Ú FILE_SYS.HÓëFILE_SYS.C Ϊch376½Ó¿Úº¯Êý ·Ö±ðÁгö

CH376INC.HÎļþ£º

/* C Define for CH376 */ /* Website: http://wch.cn */ /* Email: tech@wch.cn */ /* Author: W.ch 2008.10 */ /* V1.0 for CH376 */

#ifndef __CH376INC_H__ #define __CH376INC_H__

#ifdef __cplusplus extern \#endif /*

********************************************************************************************************************* */ /* ³£ÓÃÀàÐͺͳ£Á¿¶¨Òå */

#ifndef TRUE #define TRUE 1 #define FALSE 0

#endif #ifndef NULL #define NULL 0 #endif

#ifndef UINT8

typedef unsigned char UINT8; #endif

#ifndef UINT16

typedef unsigned short UINT16; #endif

#ifndef UINT32

typedef unsigned long UINT32; #endif

#ifndef PUINT8

typedef unsigned char *PUINT8; #endif

#ifndef PUINT16

typedef unsigned short *PUINT16; #endif

#ifndef PUINT32

typedef unsigned long *PUINT32; #endif

#ifndef UINT8V

typedef unsigned char volatile UINT8V; #endif

#ifndef PUINT8V

typedef unsigned char volatile *PUINT8V; #endif /*

********************************************************************************************************************* */ /* Ó²¼þÌØÐÔ */

#define CH376_DAT_BLOCK_LEN 0x40 /* USBµ¥¸öÊý¾Ý°ü, Êý¾Ý¿éµÄ×î´ó³¤¶È, ĬÈÏ»º³åÇøµÄ³¤¶È */ /*

********************************************************************************************************************* */ /* ÃüÁî´úÂë */

/* ²¿·ÖÃüÁî¼æÈÝCH375оƬ, µ«ÊÇÊäÈëÊý¾Ý»òÕßÊä³öÊý¾ÝµÄ¿ÉÄֲܾ¿²»Í¬) */ /* Ò»¸öÃüÁî²Ù×÷˳Ðò°üº¬:

Ò»¸öÃüÁîÂë(¶ÔÓÚ´®¿Ú·½Ê½,ÃüÁîÂë֮ǰ»¹ÐèÒªÁ½¸öͬ²½Âë), Èô¸É¸öÊäÈëÊý¾Ý(¿ÉÒÔÊÇ0¸ö),

²úÉúÖжÏ֪ͨ »òÕß Èô¸É¸öÊä³öÊý¾Ý(¿ÉÒÔÊÇ0¸ö), ¶þѡһ, ÓÐÖжÏ֪ͨÔòÒ»¶¨Ã»ÓÐÊä³öÊý¾Ý, ÓÐÊä³öÊý¾ÝÔòÒ»¶¨²»²úÉúÖжÏ

½öCMD01_WR_REQ_DATAÃüÁîÀýÍâ, ˳Ðò°üº¬: Ò»¸öÃüÁîÂë, Ò»¸öÊä³öÊý¾Ý, Èô¸É¸öÊäÈëÊý¾Ý

ÃüÁîÂëÆðÃû¹æÔò: CMDxy_NAME

ÆäÖеÄxºÍy¶¼ÊÇÊý×Ö, x˵Ã÷×îÉÙÊäÈëÊý¾Ý¸öÊý(×Ö½ÚÊý), y˵Ã÷×îÉÙÊä³öÊý¾Ý¸öÊý(×Ö½ÚÊý), yÈç¹ûÊÇHÔò˵Ã÷²úÉúÖжÏ֪ͨ,

ÓÐЩÃüÁîÄܹ»ÊµÏÖ0µ½¶à¸ö×Ö½ÚµÄÊý¾Ý¿é¶Áд, Êý¾Ý¿é±¾ÉíµÄ×Ö½ÚÊýδ°üº¬ÔÚÉÏÊöx»òyÖ®ÄÚ */

/* ±¾ÎļþĬÈÏ»áͬʱÌṩÓëCH375оƬÃüÁîÂë¼æÈݵÄÃüÁîÂë¸ñʽ£¨¼´È¥µôxºÍyÖ®ºó), Èç¹û²»ÐèÒª, ÄÇô¿ÉÒÔ¶¨Òå_NO_CH375_COMPATIBLE_½ûÖ¹ */ /*

********************************************************************************************************************* */

/* Ö÷ÒªÃüÁî(ÊÖ²áÒ»), ³£Óà */

#define CMD01_GET_IC_VER 0x01 /* »ñȡоƬ¼°¹Ì¼þ°æ±¾ */ /* Êä³ö: °æ±¾ºÅ( λ7Ϊ0, λ6Ϊ1, λ5~λ0Ϊ°æ±¾ºÅ ) */ /* CH376·µ»Ø°æ±¾ºÅµÄֵΪ041H¼´°æ±¾ºÅΪ01H */

#define CMD21_SET_BAUDRATE 0x02 /* ´®¿Ú·½Ê½: ÉèÖô®¿ÚͨѶ²¨ÌØÂÊ(Éϵç»òÕ߸´Î»ºóµÄĬÈϲ¨ÌØÂÊΪ9600bps,ÓÉD4/D5/D6Òý½ÅÑ¡Ôñ) */ /* ÊäÈë: ²¨ÌØÂÊ·ÖÆµÏµÊý, ²¨ÌØÂÊ·ÖÆµ³£Êý */

/* Êä³ö: ²Ù×÷״̬( CMD_RET_SUCCESS»òCMD_RET_ABORT, ÆäËüֵ˵Ã÷²Ù×÷δÍê³É ) */

#define CMD00_ENTER_SLEEP 0x03 /* ½øÈë˯Ãß״̬ */

#define CMD00_RESET_ALL

0x05

/* Ö´ÐÐÓ²¼þ¸´Î» */

#define CMD11_CHECK_EXIST 0x06 /* ²âÊÔͨѶ½Ó¿ÚºÍ¹¤×÷״̬ */ /* ÊäÈë: ÈÎÒâÊý¾Ý */

/* Êä³ö: ÊäÈëÊý¾ÝµÄ°´Î»È¡·´ */

#define CMD20_CHK_SUSPEND 0x0B /* É豸·½Ê½: ÉèÖüì²éUSB×ÜÏß¹ÒÆð״̬µÄ·½Ê½ */

/* ÊäÈë: Êý¾Ý10H, ¼ì²é·½Ê½ */

/* 00H=²»¼ì²éUSB¹ÒÆð, 04H=ÒÔ50mSΪ¼ä¸ô¼ì²éUSB¹ÒÆð, 05H=ÒÔ10mSΪ¼ä¸ô¼ì²éUSB¹ÒÆð */

#define CMD20_SET_SDO_INT 0x0B /* SPI½Ó¿Ú·½Ê½: ÉèÖÃSPIµÄSDOÒý½ÅµÄÖжϷ½Ê½ */

/* ÊäÈë: Êý¾Ý16H, ÖжϷ½Ê½ */

/* 10H=½ûÖ¹SDOÒý½ÅÓÃÓÚÖжÏÊä³ö,ÔÚSCSƬѡÎÞЧʱÈý̬Êä³ö½ûÖ¹, 90H=SDOÒý½ÅÔÚSCSƬѡÎÞЧʱ¼æ×öÖжÏÇëÇóÊä³ö */

#define CMD14_GET_FILE_SIZE 0x0C /* Ö÷»úÎļþģʽ: »ñÈ¡µ±Ç°Îļþ³¤¶È */ /* ÊäÈë: Êý¾Ý68H */

/* Êä³ö: µ±Ç°Îļþ³¤¶È(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */

#define CMD50_SET_FILE_SIZE 0x0D /* Ö÷»úÎļþģʽ: ÉèÖõ±Ç°Îļþ³¤¶È */ /* ÊäÈë: Êý¾Ý68H, µ±Ç°Îļþ³¤¶È(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */

#define CMD11_SET_USB_MODE 0x15 /* ÉèÖÃUSB¹¤×÷ģʽ */ /* ÊäÈë: ģʽ´úÂë */

/* 00H=δÆôÓõÄÉ豸·½Ê½, 01H=ÒÑÆôÓõÄÉ豸·½Ê½²¢ÇÒʹÓÃÍⲿ¹Ì¼þģʽ(´®¿Ú²»Ö§³Ö), 02H=ÒÑÆôÓõÄÉ豸·½Ê½²¢ÇÒʹÓÃÄÚÖù̼þģʽ */

/* 03H=SD¿¨Ö÷»úģʽ/δÆôÓõÄÖ÷»úģʽ,ÓÃÓÚ¹ÜÀíºÍ´æÈ¡SD¿¨ÖеÄÎļþ */

/* 04H=δÆôÓõÄÖ÷»ú·½Ê½, 05H=ÒÑÆôÓõÄÖ÷»ú·½Ê½, 06H=ÒÑÆôÓõÄÖ÷»ú·½Ê½²¢ÇÒ×Ô¶¯²úÉúSOF°ü, 07H=ÒÑÆôÓõÄÖ÷»ú·½Ê½²¢ÇÒ¸´Î»USB×ÜÏß */

/* Êä³ö: ²Ù×÷״̬( CMD_RET_SUCCESS»òCMD_RET_ABORT, ÆäËüֵ˵Ã÷²Ù×÷δÍê³É ) */

#define CMD01_GET_STATUS 0x22 /* Êä³ö: ÖжÏ״̬ */

#define CMD00_UNLOCK_USB 0x23

/* »ñÈ¡ÖжÏ״̬²¢È¡ÏûÖжÏÇëÇó */

/* É豸·½Ê½: Êͷŵ±Ç°USB»º³åÇø */

#define CMD01_RD_USB_DATA0 0x27 /* ´Óµ±Ç°USBÖжϵĶ˵㻺³åÇø»òÕßÖ÷»ú¶ËµãµÄ½ÓÊÕ»º³åÇø¶ÁÈ¡Êý¾Ý¿é */ /* Êä³ö: ³¤¶È, Êý¾ÝÁ÷ */

#define CMD01_RD_USB_DATA 0x28 /* É豸·½Ê½: ´Óµ±Ç°USBÖжϵĶ˵㻺³åÇø¶ÁÈ¡Êý¾Ý¿é, ²¢ÊÍ·Å»º³åÇø, Ï൱ÓÚ CMD01_RD_USB_DATA0 + CMD00_UNLOCK_USB */ /* Êä³ö: ³¤¶È, Êý¾ÝÁ÷ */

#define CMD10_WR_USB_DATA7 0x2B /* É豸·½Ê½: ÏòUSB¶Ëµã2µÄ·¢ËÍ»º³åÇøÐ´ÈëÊý¾Ý¿é */

/* ÊäÈë: ³¤¶È, Êý¾ÝÁ÷ */

#define CMD10_WR_HOST_DATA 0x2C /* ÏòUSBÖ÷»ú¶ËµãµÄ·¢ËÍ»º³åÇøÐ´ÈëÊý¾Ý¿é */

/* ÊäÈë: ³¤¶È, Êý¾ÝÁ÷ */

#define CMD01_WR_REQ_DATA 0x2D /* ÏòÄÚ²¿Ö¸¶¨»º³åÇøÐ´ÈëÇëÇóµÄÊý¾Ý¿é */

/* Êä³ö: ³¤¶È */

/* ÊäÈë: Êý¾ÝÁ÷ */

#define CMD20_WR_OFS_DATA 0x2E */

/* ÏòÄÚ²¿»º³åÇøÖ¸¶¨Æ«ÒƵØÖ·Ð´ÈëÊý¾Ý¿é

/* ÊäÈë: Æ«ÒÆ, ³¤¶È, Êý¾ÝÁ÷ */

#define CMD10_SET_FILE_NAME 0x2F /* Ö÷»úÎļþģʽ: ÉèÖý«Òª²Ù×÷µÄÎļþµÄÎļþÃû */

/* ÊäÈë: ÒÔ0½áÊøµÄ×Ö·û´®(º¬½áÊø·û0ÔÚÄÚ³¤¶È²»³¬¹ý14¸ö×Ö·û) */ /*

********************************************************************************************************************* */

/* Ö÷ÒªÃüÁî(ÊÖ²áÒ»), ³£ÓÃ, ÒÔÏÂÃüÁî×ÜÊÇÔÚ²Ù×÷½áÊøÊ±²úÉúÖжÏ֪ͨ, ²¢ÇÒ×ÜÊÇûÓÐÊä³öÊý¾Ý */

#define CMD0H_DISK_CONNECT 0x30 ·ñÁ¬½Ó */

/* Êä³öÖÐ¶Ï */

#define CMD0H_DISK_MOUNT 0x31 ·ñ¾ÍÐ÷ */

/* Êä³öÖÐ¶Ï */

/* Ö÷»úÎļþģʽ/²»Ö§³ÖSD¿¨: ¼ì²é´ÅÅÌÊÇ

/* Ö÷»úÎļþģʽ: ³õʼ»¯´ÅÅ̲¢²âÊÔ´ÅÅÌÊÇ

#define CMD0H_FILE_OPEN 0x32 ¼þ¼Ð),»òÕßö¾ÙÎļþºÍĿ¼(Îļþ¼Ð) */ /* Êä³öÖÐ¶Ï */

#define CMD0H_FILE_ENUM_GO 0x33 (Îļþ¼Ð) */

/* Êä³öÖÐ¶Ï */

/* Ö÷»úÎļþģʽ: ´ò¿ªÎļþ»òÕßĿ¼(ÎÄ

/* Ö÷»úÎļþģʽ: ¼ÌÐøÃ¶¾ÙÎļþºÍĿ¼

#define CMD0H_FILE_CREATE 0x34 /* Ö÷»úÎļþģʽ: н¨Îļþ,Èç¹ûÎļþÒѾ­´æÔÚÄÇôÏÈɾ³ý */ /* Êä³öÖÐ¶Ï */

#define CMD0H_FILE_ERASE 0x35 /* Ö÷»úÎļþģʽ: ɾ³ýÎļþ,Èç¹ûÒѾ­´ò¿ªÔòÖ±½Óɾ³ý,·ñÔò¶ÔÓÚÎļþ»áÏÈ´ò¿ªÔÙɾ³ý,×ÓĿ¼±ØÐëÏÈ´ò¿ª */ /* Êä³öÖÐ¶Ï */

#define CMD1H_FILE_CLOSE 0x36 /* Ö÷»úÎļþģʽ: ¹Ø±Õµ±Ç°ÒѾ­´ò¿ªµÄÎļþ»òÕßĿ¼(Îļþ¼Ð) */

/* ÊäÈë: ÊÇ·ñÔÊÐí¸üÐÂÎļþ³¤¶È */

/* 00H=½ûÖ¹¸ü㤶È, 01H=ÔÊÐí¸üг¤¶È */

/* Êä³öÖÐ¶Ï */

#define CMD1H_DIR_INFO_READ */

0x37 /* Ö÷»úÎļþģʽ: ¶ÁÈ¡ÎļþµÄĿ¼ÐÅÏ¢

/* ÊäÈë: Ö¸¶¨ÐèÒª¶ÁÈ¡µÄĿ¼ÐÅÏ¢½á¹¹ÔÚÉÈÇøÄÚµÄË÷ÒýºÅ */

/* Ë÷ÒýºÅ·¶Î§Îª00H~0FH, Ë÷ÒýºÅ0FFHÔòΪµ±Ç°ÒѾ­´ò¿ªµÄÎļþ */ /* Êä³öÖÐ¶Ï */

#define CMD0H_DIR_INFO_SAVE */

/* Êä³öÖÐ¶Ï */

#define CMD4H_BYTE_LOCATE 0x39 /* Ö÷»úÎļþģʽ: ÒÔ×Ö½ÚΪµ¥Î»Òƶ¯µ±Ç°ÎļþÖ¸Õë */

/* ÊäÈë: Æ«ÒÆ×Ö½ÚÊý(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */ /* Êä³öÖÐ¶Ï */

#define CMD2H_BYTE_READ 0x3A /* Ö÷»úÎļþģʽ: ÒÔ×Ö½ÚΪµ¥Î»´Óµ±Ç°Î»ÖöÁÈ¡Êý¾Ý¿é */

/* ÊäÈë: ÇëÇó¶ÁÈ¡µÄ×Ö½ÚÊý(×ܳ¤¶È16λ,µÍ×Ö½ÚÔÚǰ) */ /* Êä³öÖÐ¶Ï */

#define CMD0H_BYTE_RD_GO 0x3B /* Êä³öÖÐ¶Ï */

/* Ö÷»úÎļþģʽ: ¼ÌÐø×Ö½Ú¶Á */

0x38

/* Ö÷»úÎļþģʽ: ±£´æÎļþµÄĿ¼ÐÅÏ¢

#define CMD2H_BYTE_WRITE 0x3C /* Ö÷»úÎļþģʽ: ÒÔ×Ö½ÚΪµ¥Î»Ïòµ±Ç°Î»ÖÃдÈëÊý¾Ý¿é */

/* ÊäÈë: ÇëÇóдÈëµÄ×Ö½ÚÊý(×ܳ¤¶È16λ,µÍ×Ö½ÚÔÚǰ) */ /* Êä³öÖÐ¶Ï */

#define CMD0H_BYTE_WR_GO 0x3D /* Êä³öÖÐ¶Ï */

#define CMD0H_DISK_CAPACITY 0x3E /* Êä³öÖÐ¶Ï */

#define CMD0H_DISK_QUERY 0x3F /* Êä³öÖÐ¶Ï */

#define CMD0H_DIR_CREATE 0x40 Èç¹ûĿ¼ÒѾ­´æÔÚÄÇôֱ½Ó´ò¿ª */ /* Êä³öÖÐ¶Ï */

#define CMD4H_SEC_LOCATE 0x4A

/* Ö÷»úÎļþģʽ: ¼ÌÐø×Ö½Úд */

/* Ö÷»úÎļþģʽ: ²éѯ´ÅÅÌÎïÀíÈÝÁ¿ */

/* Ö÷»úÎļþģʽ: ²éѯ´ÅÅ̿ռäÐÅÏ¢ */

/* Ö÷»úÎļþģʽ: н¨Ä¿Â¼(Îļþ¼Ð)²¢´ò¿ª,

/* Ö÷»úÎļþģʽ: ÒÔÉÈÇøÎªµ¥Î»Òƶ¯µ±

ǰÎļþÖ¸Õë */

/* ÊäÈë: Æ«ÒÆÉÈÇøÊý(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */ /* Êä³öÖÐ¶Ï */

#define CMD1H_SEC_READ 0x4B λ´Óµ±Ç°Î»ÖöÁÈ¡Êý¾Ý¿é */ /* ÊäÈë: ÇëÇó¶ÁÈ¡µÄÉÈÇøÊý */ /* Êä³öÖÐ¶Ï */

#define CMD1H_SEC_WRITE Ϊµ¥Î»ÔÚµ±Ç°Î»ÖÃдÈëÊý¾Ý¿é */ /* ÊäÈë: ÇëÇóдÈëµÄÉÈÇøÊý */ /* Êä³öÖÐ¶Ï */

/* Ö÷»úÎļþģʽ/²»Ö§³ÖSD¿¨: ÒÔÉÈÇøÎªµ¥

0x4C /* Ö÷»úÎļþģʽ/²»Ö§³ÖSD¿¨: ÒÔÉÈÇø

#define CMD0H_DISK_BOC_CMD 0x50 /* Ö÷»ú·½Ê½/²»Ö§³ÖSD¿¨: ¶ÔUSB´æ´¢

Æ÷Ö´ÐÐBulkOnly´«ÊäЭÒéµÄÃüÁî */ /* Êä³öÖÐ¶Ï */

#define CMD5H_DISK_READ 0x54 /* Ö÷»ú·½Ê½/²»Ö§³ÖSD¿¨: ´ÓUSB´æ´¢Æ÷¶ÁÎïÀíÉÈÇø */

/* ÊäÈë: LBAÎïÀíÉÈÇøµØÖ·(×ܳ¤¶È32λ, µÍ×Ö½ÚÔÚǰ), ÉÈÇøÊý(01H~FFH) */ /* Êä³öÖÐ¶Ï */

#define CMD0H_DISK_RD_GO 0x55 /* Ö÷»ú·½Ê½/²»Ö§³ÖSD¿¨: ¼ÌÐøÖ´ÐÐUSB´æ´¢Æ÷µÄÎïÀíÉÈÇø¶Á²Ù×÷ */ /* Êä³öÖÐ¶Ï */

#define CMD5H_DISK_WRITE 0x56 /* Ö÷»ú·½Ê½/²»Ö§³ÖSD¿¨: ÏòUSB´æ´¢Æ÷дÎïÀíÉÈÇø */

/* ÊäÈë: LBAÎïÀíÉÈÇøµØÖ·(×ܳ¤¶È32λ, µÍ×Ö½ÚÔÚǰ), ÉÈÇøÊý(01H~FFH) */ /* Êä³öÖÐ¶Ï */

#define CMD0H_DISK_WR_GO 0x57 /* Ö÷»ú·½Ê½/²»Ö§³ÖSD¿¨: ¼ÌÐøÖ´ÐÐUSB´æ´¢Æ÷µÄÎïÀíÉÈÇøÐ´²Ù×÷ */ /* Êä³öÖÐ¶Ï */ /*

********************************************************************************************************************* */

/* ¸¨ÖúÃüÁî(ÊÖ²á¶þ), ²»Ì«³£ÓûòÕßÊÇΪÁËÓëCH375ºÍCH372¼æÈÝ */

#define CMD10_SET_USB_SPEED 0x04 /* ÉèÖÃUSB×ÜÏßËÙ¶È, ÔÚÿ´ÎCMD11_SET_USB_MODEÉèÖÃUSB¹¤×÷ģʽʱ»á×Ô¶¯»Ö¸´µ½12MbpsÈ«ËÙ */ /* ÊäÈë: ×ÜÏßËÙ¶È´úÂë */

/* 00H=12MbpsÈ«ËÙFullSpeed£¨Ä¬ÈÏÖµ£©, 01H=1.5Mbps£¨½öÐÞ¸ÄÆµÂÊ£©, 02H=1.5MbpsµÍËÙLowSpeed */

#define CMD11_GET_DEV_RATE 0x0A /* Ö÷»ú·½Ê½: »ñÈ¡µ±Ç°Á¬½ÓµÄUSBÉ豸µÄÊý¾ÝËÙÂÊÀàÐÍ */ /* ÊäÈë: Êý¾Ý07H */

/* Êä³ö: Êý¾ÝËÙÂÊÀàÐÍ */

/* λ4Ϊ1ÔòÊÇ1.5MbpsµÍËÙUSBÉ豸, ·ñÔòÊÇ12MbpsÈ«ËÙUSBÉ豸 */

#define CMD11_GET_TOGGLE 0x0A /* »ñÈ¡OUTÊÂÎñµÄͬ²½×´Ì¬ */ /* ÊäÈë: Êý¾Ý1AH */ /* Êä³ö: ͬ²½×´Ì¬ */

/* λ4Ϊ1ÔòOUTÊÂÎñͬ²½, ·ñÔòOUTÊÂÎñ²»Í¬²½ */

#define CMD11_READ_VAR8 0x0A /* ¶Áȡָ¶¨µÄ8λÎļþϵͳ±äÁ¿ */ /* ÊäÈë: ±äÁ¿µØÖ· */ /* Êä³ö: Êý¾Ý */

/*#define CMD11_GET_MAX_LUN = CMD11_READ_VAR8( VAR_UDISK_LUN )*/ /* Ö÷»ú·½Ê½: »ñÈ¡USB´æ´¢Æ÷×î´óºÍµ±Ç°Âß¼­µ¥ÔªºÅ */

#define CMD20_SET_RETRY 0x0B /* Ö÷»ú·½Ê½: ÉèÖÃUSBÊÂÎñ²Ù×÷µÄÖØÊÔ´ÎÊý */

/* ÊäÈë: Êý¾Ý25H, ÖØÊÔ´ÎÊý */

/* λ7Ϊ0ÔòÊÕµ½NAKʱ²»ÖØÊÔ, λ7Ϊ1λ6Ϊ0ÔòÊÕµ½NAKʱÎÞÏÞÖØÊÔ, λ7Ϊ1λ6Ϊ1ÔòÊÕµ½NAKʱ×î¶àÖØÊÔ3Ãë, λ5~λ0Ϊ³¬Ê±ºóµÄÖØÊÔ´ÎÊý */

#define CMD20_WRITE_VAR8 0x0B /* ÊäÈë: ±äÁ¿µØÖ·, Êý¾Ý */

/* ÉèÖÃÖ¸¶¨µÄ8λÎļþϵͳ±äÁ¿ */

/*#define CMD20_SET_DISK_LUN = CMD20_WRITE_VAR8( VAR_UDISK_LUN )*/ /* Ö÷»ú·½Ê½: ÉèÖÃUSB´æ´¢Æ÷µÄµ±Ç°Âß¼­µ¥ÔªºÅ */

#define CMD14_READ_VAR32 0x0C /* ¶Áȡָ¶¨µÄ32λÎļþϵͳ±äÁ¿ */ /* ÊäÈë: ±äÁ¿µØÖ· */

/* Êä³ö: Êý¾Ý(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */

#define CMD50_WRITE_VAR32 0x0D /* ÉèÖÃÖ¸¶¨µÄ32λÎļþϵͳ±äÁ¿ */ /* ÊäÈë: ±äÁ¿µØÖ·, Êý¾Ý(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */

#define CMD01_DELAY_100US 0x0F /* ÑÓʱ100uS(´®¿Ú²»Ö§³Ö) */ /* Êä³ö: ÑÓʱÆÚ¼äÊä³ö0,ÑÓʱ½áÊøÊä³ö·Ç0 */

#define CMD40_SET_USB_ID 0x12 /* É豸·½Ê½: ÉèÖÃUSB³§ÉÌVIDºÍ²úÆ·PID */

/* ÊäÈë: ³§ÉÌIDµÍ×Ö½Ú, ³§ÉÌID¸ß×Ö½Ú, ²úÆ·IDµÍ×Ö½Ú, ²úÆ·ID¸ß×Ö½Ú */

#define CMD10_SET_USB_ADDR 0x13 /* ÉèÖÃUSBµØÖ· */ /* ÊäÈë: µØÖ·Öµ */

#define CMD01_TEST_CONNECT 0x16 /* Ö÷»ú·½Ê½/²»Ö§³ÖSD¿¨: ¼ì²éUSBÉ豸Á¬½Ó״̬ */

/* Êä³ö: ״̬( USB_INT_CONNECT»òUSB_INT_DISCONNECT»òUSB_INT_USB_READY, ÆäËüֵ˵Ã÷²Ù×÷δÍê³É ) */

#define CMD00_ABORT_NAK

0x17

/* Ö÷»ú·½Ê½: ·ÅÆúµ±Ç°NAKµÄÖØÊÔ */

#define CMD10_SET_ENDP2 0x18 /* É豸·½Ê½(´®¿Ú²»Ö§³Ö): ÉèÖÃUSB¶Ëµã0µÄ½ÓÊÕÆ÷ */

/* ÊäÈë: ¹¤×÷·½Ê½ */

/* λ7Ϊ1Ôòλ6Ϊͬ²½´¥·¢Î», ·ñÔòͬ²½´¥·¢Î»²»±ä */

/* λ3~λ0ΪÊÂÎñÏìÓ¦·½Ê½: 0000-¾ÍÐ÷ACK, 1110-ÕýæNAK, 1111-´íÎóSTALL */

#define CMD10_SET_ENDP3 0x19 /* É豸·½Ê½(´®¿Ú²»Ö§³Ö): ÉèÖÃUSB¶Ëµã0µÄ·¢ËÍÆ÷ */

/* ÊäÈë: ¹¤×÷·½Ê½ */

/* λ7Ϊ1Ôòλ6Ϊͬ²½´¥·¢Î», ·ñÔòͬ²½´¥·¢Î»²»±ä */

/* λ3~λ0ΪÊÂÎñÏìÓ¦·½Ê½: 0000~1000-¾ÍÐ÷ACK, 1110-ÕýæNAK, 1111-´íÎóSTALL */

#define CMD10_SET_ENDP4 0x1A /* É豸·½Ê½(´®¿Ú²»Ö§³Ö): ÉèÖÃUSB¶Ëµã1µÄ½ÓÊÕÆ÷ */ /* ÊäÈë: ¹¤×÷·½Ê½ */

/* λ7Ϊ1Ôòλ6Ϊͬ²½´¥·¢Î», ·ñÔòͬ²½´¥·¢Î»²»±ä */

/* λ3~λ0ΪÊÂÎñÏìÓ¦·½Ê½: 0000-¾ÍÐ÷ACK, 1110-ÕýæNAK, 1111-´íÎóSTALL */

#define CMD10_SET_ENDP5 0x1B /* É豸·½Ê½(´®¿Ú²»Ö§³Ö): ÉèÖÃUSB¶Ëµã1µÄ·¢ËÍÆ÷ */

/* ÊäÈë: ¹¤×÷·½Ê½ */

/* λ7Ϊ1Ôòλ6Ϊͬ²½´¥·¢Î», ·ñÔòͬ²½´¥·¢Î»²»±ä */

/* λ3~λ0ΪÊÂÎñÏìÓ¦·½Ê½: 0000~1000-¾ÍÐ÷ACK, 1110-ÕýæNAK, 1111-´íÎóSTALL */

#define CMD10_SET_ENDP6 0x1C /* ÉèÖÃUSB¶Ëµã2/Ö÷»ú¶ËµãµÄ½ÓÊÕÆ÷ */

/* ÊäÈë: ¹¤×÷·½Ê½ */

/* λ7Ϊ1Ôòλ6Ϊͬ²½´¥·¢Î», ·ñÔòͬ²½´¥·¢Î»²»±ä */

/* λ3~λ0ΪÊÂÎñÏìÓ¦·½Ê½: 0000-¾ÍÐ÷ACK, 1101-¾ÍÐ÷µ«²»·µ»ØACK, 1110-ÕýæNAK, 1111-´íÎóSTALL */

#define CMD10_SET_ENDP7 0x1D /* ÉèÖÃUSB¶Ëµã2/Ö÷»ú¶ËµãµÄ·¢ËÍÆ÷ */

/* ÊäÈë: ¹¤×÷·½Ê½ */

/* λ7Ϊ1Ôòλ6Ϊͬ²½´¥·¢Î», ·ñÔòͬ²½´¥·¢Î»²»±ä */

/* λ3~λ0ΪÊÂÎñÏìÓ¦·½Ê½: 0000-¾ÍÐ÷ACK, 1101-¾ÍÐ÷µ«ÎÞÐëÓ¦´ð, 1110-ÕýæNAK, 1111-´íÎóSTALL */

#define CMD00_DIRTY_BUFFER 0x25 ³åÇø */

#define CMD10_WR_USB_DATA3 µÄ·¢ËÍ»º³åÇøÐ´ÈëÊý¾Ý¿é */ /* ÊäÈë: ³¤¶È, Êý¾ÝÁ÷ */

/* Ö÷»úÎļþģʽ: Çå³ýÄÚ²¿µÄ´ÅÅ̺ÍÎļþ»º

0x29 /* É豸·½Ê½(´®¿Ú²»Ö§³Ö): ÏòUSB¶Ëµã0

#define CMD10_WR_USB_DATA5 0x2A /* É豸·½Ê½(´®¿Ú²»Ö§³Ö): ÏòUSB¶Ëµã1µÄ·¢ËÍ»º³åÇøÐ´ÈëÊý¾Ý¿é */ /* ÊäÈë: ³¤¶È, Êý¾ÝÁ÷ */ /*

********************************************************************************************************************* */

/* ¸¨ÖúÃüÁî(ÊÖ²á¶þ), ²»Ì«³£ÓûòÕßÊÇΪÁËÓëCH375ºÍCH372¼æÈÝ, ÒÔÏÂÃüÁî×ÜÊÇÔÚ²Ù×÷½áÊøÊ±²úÉúÖжÏ֪ͨ, ²¢ÇÒ×ÜÊÇûÓÐÊä³öÊý¾Ý */

#define CMD1H_CLR_STALL 0x41 /* ÊäÈë: ¶ËµãºÅ */ /* Êä³öÖÐ¶Ï */

#define CMD1H_SET_ADDRESS 0x45 /* ÊäÈë: µØÖ·Öµ */ /* Êä³öÖÐ¶Ï */

/* Ö÷»ú·½Ê½: ¿ØÖÆ´«Êä-Çå³ý¶Ëµã´íÎó */

/* Ö÷»ú·½Ê½: ¿ØÖÆ´«Êä-ÉèÖÃUSBµØÖ· */

#define CMD1H_GET_DESCR 0x46 /* ÊäÈë: ÃèÊö·ûÀàÐÍ */ /* Êä³öÖÐ¶Ï */

#define CMD1H_SET_CONFIG 0x49 /* ÊäÈë: ÅäÖÃÖµ */ /* Êä³öÖÐ¶Ï */

#define CMD0H_AUTO_SETUP 0x4D

/* Ö÷»ú·½Ê½: ¿ØÖÆ´«Êä-»ñÈ¡ÃèÊö·û */

/* Ö÷»ú·½Ê½: ¿ØÖÆ´«Êä-ÉèÖÃUSBÅäÖà */

/* Ö÷»ú·½Ê½/²»Ö§³ÖSD¿¨: ×Ô¶¯ÅäÖÃ

USBÉ豸 */ /* Êä³öÖÐ¶Ï */

#define CMD2H_ISSUE_TKN_X 0x4E /* Ö÷»ú·½Ê½: ·¢³öͬ²½ÁîÅÆ, Ö´ÐÐÊÂÎñ, ¸ÃÃüÁî¿É´úÌæ CMD10_SET_ENDP6/CMD10_SET_ENDP7 + CMD1H_ISSUE_TOKEN */ /* ÊäÈë: ͬ²½±êÖ¾, ÊÂÎñÊôÐÔ */

/* ͬ²½±êÖ¾µÄλ7ΪÖ÷»ú¶ËµãINµÄͬ²½´¥·¢Î», λ6ΪÖ÷»ú¶ËµãOUTµÄͬ²½´¥·¢Î», λ5~λ0±ØÐëΪ0 */

/* ÊÂÎñÊôÐԵĵÍ4λÊÇÁîÅÆ, ¸ß4λÊǶ˵ãºÅ */ /* Êä³öÖÐ¶Ï */

#define CMD1H_ISSUE_TOKEN 0x4F /* Ö÷»ú·½Ê½: ·¢³öÁîÅÆ, Ö´ÐÐÊÂÎñ, ½¨ÒéÓÃCMD2H_ISSUE_TKN_XÃüÁî */ /* ÊäÈë: ÊÂÎñÊôÐÔ */

/* µÍ4λÊÇÁîÅÆ, ¸ß4λÊǶ˵ãºÅ */ /* Êä³öÖÐ¶Ï */

#define CMD0H_DISK_INIT Æ÷ */

/* Êä³öÖÐ¶Ï */

#define CMD0H_DISK_RESET USB´æ´¢Æ÷ */ /* Êä³öÖÐ¶Ï */

0x51

/* Ö÷»ú·½Ê½/²»Ö§³ÖSD¿¨: ³õʼ»¯USB´æ´¢

0x52 /* Ö÷»ú·½Ê½/²»Ö§³ÖSD¿¨: ¿ØÖÆ´«Êä-¸´Î»

#define CMD0H_DISK_SIZE 0x53 µÄÈÝÁ¿ */

/* Êä³öÖÐ¶Ï */

#define CMD0H_DISK_INQUIRY 0x58 ÌØÐÔ */

/* Êä³öÖÐ¶Ï */

#define CMD0H_DISK_READY 0x59 ¾ÍÐ÷ */

/* Êä³öÖÐ¶Ï */

#define CMD0H_DISK_R_SENSE 0x5A ´¢Æ÷´íÎó */ /* Êä³öÖÐ¶Ï */

#define CMD0H_RD_DISK_SEC 0x5B ¾Ýµ½ÄÚ²¿»º³åÇø */ /* Êä³öÖÐ¶Ï */

/* Ö÷»ú·½Ê½/²»Ö§³ÖSD¿¨: »ñÈ¡USB´æ´¢Æ÷

/* Ö÷»ú·½Ê½/²»Ö§³ÖSD¿¨: ²éѯUSB´æ´¢Æ÷

/* Ö÷»ú·½Ê½/²»Ö§³ÖSD¿¨: ¼ì²éUSB´æ´¢Æ÷

/* Ö÷»ú·½Ê½/²»Ö§³ÖSD¿¨: ¼ì²éUSB´æ

/* Ö÷»úÎļþģʽ: ´Ó´ÅÅ̶Áȡһ¸öÉÈÇøµÄÊý

#define CMD0H_WR_DISK_SEC 0x5C µÄÊý¾ÝдÈë´ÅÅÌ */ /* Êä³öÖÐ¶Ï */

/* Ö÷»úÎļþģʽ: ½«ÄÚ²¿»º³åÇøµÄÒ»¸öÉÈÇø

#define CMD0H_DISK_MAX_LUN 0x5D /* Ö÷»ú·½Ê½: ¿ØÖÆ´«Êä-»ñÈ¡USB´æ´¢Æ÷×î´óÂß¼­µ¥ÔªºÅ */ /* Êä³öÖÐ¶Ï */ /*

********************************************************************************************************************* */

/* ÒÔ϶¨ÒåÖ»ÊÇΪÁ˼æÈÝCH375µÄINCLUDEÎļþÖеÄÃüÁîÃû³Æ¸ñʽ */

#ifndef _NO_CH375_COMPATIBLE_ #define CMD_GET_IC_VER CMD01_GET_IC_VER #define CMD_SET_BAUDRATE CMD21_SET_BAUDRATE #define CMD_ENTER_SLEEP CMD00_ENTER_SLEEP #define CMD_RESET_ALL CMD00_RESET_ALL #define CMD_CHECK_EXIST CMD11_CHECK_EXIST #define CMD_CHK_SUSPEND CMD20_CHK_SUSPEND #define CMD_SET_SDO_INT CMD20_SET_SDO_INT #define CMD_GET_FILE_SIZE CMD14_GET_FILE_SIZE #define CMD_SET_FILE_SIZE CMD50_SET_FILE_SIZE #define CMD_SET_USB_MODE CMD11_SET_USB_MODE #define CMD_GET_STATUS CMD01_GET_STATUS #define CMD_UNLOCK_USB CMD00_UNLOCK_USB #define CMD_RD_USB_DATA0 CMD01_RD_USB_DATA0 #define CMD_RD_USB_DATA CMD01_RD_USB_DATA #define CMD_WR_USB_DATA7 CMD10_WR_USB_DATA7 #define CMD_WR_HOST_DATA CMD10_WR_HOST_DATA #define CMD_WR_REQ_DATA CMD01_WR_REQ_DATA #define CMD_WR_OFS_DATA CMD20_WR_OFS_DATA #define CMD_SET_FILE_NAME CMD10_SET_FILE_NAME #define CMD_DISK_CONNECT CMD0H_DISK_CONNECT #define CMD_DISK_MOUNT CMD0H_DISK_MOUNT #define CMD_FILE_OPEN CMD0H_FILE_OPEN

#define CMD_FILE_ENUM_GO CMD0H_FILE_ENUM_GO #define CMD_FILE_CREATE CMD0H_FILE_CREATE #define CMD_FILE_ERASE CMD0H_FILE_ERASE #define CMD_FILE_CLOSE CMD1H_FILE_CLOSE #define CMD_DIR_INFO_READ CMD1H_DIR_INFO_READ #define CMD_DIR_INFO_SAVE CMD0H_DIR_INFO_SAVE #define CMD_BYTE_LOCATE CMD4H_BYTE_LOCATE

#define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define CMD_BYTE_READ CMD_BYTE_RD_GO CMD_BYTE_WRITE CMD_BYTE_WR_GO CMD_DISK_CAPACITY CMD_DISK_QUERY CMD_DIR_CREATE CMD_SEC_LOCATE CMD_SEC_READ CMD_SEC_WRITE CMD_DISK_BOC_CMD CMD_DISK_READ CMD_DISK_RD_GO CMD_DISK_WRITE CMD_DISK_WR_GO CMD_SET_USB_SPEED CMD_GET_DEV_RATE CMD_GET_TOGGLE CMD_READ_VAR8 CMD_SET_RETRY CMD_WRITE_VAR8 CMD_READ_VAR32 CMD_WRITE_VAR32 CMD_DELAY_100US CMD_SET_USB_ID CMD_SET_USB_ADDR CMD_TEST_CONNECT CMD_ABORT_NAK CMD_SET_ENDP2 CMD_SET_ENDP3 CMD_SET_ENDP4 CMD_SET_ENDP5 CMD_SET_ENDP6 CMD_SET_ENDP7 CMD_DIRTY_BUFFER CMD_WR_USB_DATA3 CMD_WR_USB_DATA5 CMD_CLR_STALL CMD_SET_ADDRESS CMD_GET_DESCR CMD_SET_CONFIG CMD_AUTO_SETUP CMD_ISSUE_TKN_X CMD_ISSUE_TOKEN CMD2H_BYTE_READ CMD0H_BYTE_RD_GO CMD2H_BYTE_WRITE CMD0H_BYTE_WR_GO CMD0H_DISK_CAPACITY CMD0H_DISK_QUERY CMD0H_DIR_CREATE CMD4H_SEC_LOCATE CMD1H_SEC_READ CMD1H_SEC_WRITE CMD0H_DISK_BOC_CMD CMD5H_DISK_READ CMD0H_DISK_RD_GO CMD5H_DISK_WRITE CMD0H_DISK_WR_GO CMD10_SET_USB_SPEED CMD11_GET_DEV_RATE CMD11_GET_TOGGLE CMD11_READ_VAR8 CMD20_SET_RETRY CMD20_WRITE_VAR8 CMD14_READ_VAR32 CMD50_WRITE_VAR32 CMD01_DELAY_100US CMD40_SET_USB_ID CMD10_SET_USB_ADDR CMD01_TEST_CONNECT CMD00_ABORT_NAK CMD10_SET_ENDP2 CMD10_SET_ENDP3 CMD10_SET_ENDP4 CMD10_SET_ENDP5 CMD10_SET_ENDP6 CMD10_SET_ENDP7 CMD00_DIRTY_BUFFER CMD10_WR_USB_DATA3 CMD10_WR_USB_DATA5 CMD1H_CLR_STALL CMD1H_SET_ADDRESS CMD1H_GET_DESCR CMD1H_SET_CONFIG CMD0H_AUTO_SETUP CMD2H_ISSUE_TKN_X CMD1H_ISSUE_TOKEN

#define CMD_DISK_INIT CMD0H_DISK_INIT #define CMD_DISK_RESET CMD0H_DISK_RESET #define CMD_DISK_SIZE CMD0H_DISK_SIZE #define CMD_DISK_INQUIRY CMD0H_DISK_INQUIRY #define CMD_DISK_READY CMD0H_DISK_READY #define CMD_DISK_R_SENSE CMD0H_DISK_R_SENSE #define CMD_RD_DISK_SEC CMD0H_RD_DISK_SEC #define CMD_WR_DISK_SEC CMD0H_WR_DISK_SEC #define CMD_DISK_MAX_LUN CMD0H_DISK_MAX_LUN #endif /*

********************************************************************************************************************* */ /* ²¢¿Ú·½Ê½, ״̬¶Ë¿Ú(¶ÁÃüÁî¶Ë¿Ú)µÄ붨Òå */ #ifndef PARA_STATE_INTB

#define PARA_STATE_INTB 0x80 /* ²¢¿Ú·½Ê½×´Ì¬¶Ë¿ÚµÄλ7: ÖжϱêÖ¾,µÍÓÐЧ */

#define PARA_STATE_BUSY 0x10 /* ²¢¿Ú·½Ê½×´Ì¬¶Ë¿ÚµÄλ4: æ±êÖ¾,¸ßÓÐЧ */ #endif /*

********************************************************************************************************************* */ /* ´®¿Ú·½Ê½, ²Ù×÷ÃüÁîǰµÄÒýµ¼Í¬²½Âë */ #ifndef SER_CMD_TIMEOUT

#define SER_CMD_TIMEOUT 32 /* ´®¿ÚÃüÁʱʱ¼ä, µ¥Î»ÎªmS, ͬ²½ÂëÖ®¼ä¼°Í¬²½ÂëÓëÃüÁîÂëÖ®¼äµÄ¼ä¸ôÓ¦¸Ã¾¡Á¿¶Ì, ³¬Ê±ºóµÄ´¦Àí·½Ê½Îª¶ªÆú */ #define SER_SYNC_CODE1 0x57 /* Æô¶¯²Ù×÷µÄµÚ1¸ö´®¿Úͬ²½Âë */ #define SER_SYNC_CODE2 0xAB /* Æô¶¯²Ù×÷µÄµÚ2¸ö´®¿Úͬ²½Âë */ #endif /*

********************************************************************************************************************* */ /* ²Ù×÷״̬ */

#ifndef CMD_RET_SUCCESS #define CMD_RET_SUCCESS 0x51 /* ÃüÁî²Ù×÷³É¹¦ */ #define CMD_RET_ABORT 0x5F /* ÃüÁî²Ù×÷ʧ°Ü */ #endif /*

********************************************************************************************************************* */ /* USBÖжÏ״̬ */

#ifndef USB_INT_EP0_SETUP

/* ÒÔÏÂ״̬´úÂëÎªÌØÊâʼþÖжÏ, Èç¹ûͨ¹ýCMD20_CHK_SUSPENDÆôÓÃUSB×ÜÏß¹ÒÆð¼ì²é, ÄÇô±ØÐë´¦ÀíUSB×ÜÏß¹ÒÆðºÍ˯Ãß»½ÐѵÄÖжÏ״̬ */ #define USB_INT_USB_SUSPEND0x05 /* USB×ÜÏß¹ÒÆðʼþ */ #define USB_INT_WAKE_UP 0x06 /* ´Ó˯ÃßÖб»»½ÐÑʼþ */

/* ÒÔÏÂ״̬´úÂë0XHÓÃÓÚUSBÉ豸·½Ê½ */

/* ÄÚÖù̼þģʽÏÂÖ»ÐèÒª´¦Àí: USB_INT_EP1_OUT, USB_INT_EP1_IN, USB_INT_EP2_OUT, USB_INT_EP2_IN */

/* λ7-λ4Ϊ0000 */

/* λ3-λ2ָʾµ±Ç°ÊÂÎñ, 00=OUT, 10=IN, 11=SETUP */

/* λ1-λ0ָʾµ±Ç°¶Ëµã, 00=¶Ëµã0, 01=¶Ëµã1, 10=¶Ëµã2, 11=USB×ÜÏ߸´Î» */ #define USB_INT_EP0_SETUP 0x0C /* USB¶Ëµã0µÄSETUP */ #define USB_INT_EP0_OUT 0x00 /* USB¶Ëµã0µÄOUT */ #define USB_INT_EP0_IN 0x08 /* USB¶Ëµã0µÄIN */ #define USB_INT_EP1_OUT 0x01 /* USB¶Ëµã1µÄOUT */ #define USB_INT_EP1_IN 0x09 /* USB¶Ëµã1µÄIN */ #define USB_INT_EP2_OUT 0x02 /* USB¶Ëµã2µÄOUT */ #define USB_INT_EP2_IN 0x0A /* USB¶Ëµã2µÄIN */ /* USB_INT_BUS_RESET 0x0000XX11B */ /* USB×ÜÏ߸´Î» */ #define USB_INT_BUS_RESET1 0x03 /* USB×ÜÏ߸´Î» */ #define USB_INT_BUS_RESET2 0x07 /* USB×ÜÏ߸´Î» */ #define USB_INT_BUS_RESET3 0x0B /* USB×ÜÏ߸´Î» */ #define USB_INT_BUS_RESET4 0x0F /* USB×ÜÏ߸´Î» */

#endif

/* ÒÔÏÂ״̬´úÂë2XH-3XHÓÃÓÚUSBÖ÷»ú·½Ê½µÄͨѶʧ°Ü´úÂë */ /* λ7-λ6Ϊ00 */ /* λ5Ϊ1 */

/* λ4ָʾµ±Ç°½ÓÊÕµÄÊý¾Ý°üÊÇ·ñͬ²½ */

/* λ3-λ0ָʾµ¼ÖÂͨѶʧ°ÜʱUSBÉ豸µÄÓ¦´ð: 0010=ACK, 1010=NAK, 1110=STALL, 0011=DATA0, 1011=DATA1, XX00=³¬Ê± */ /* USB_INT_RET_ACK 0x001X0010B */ /* ´íÎó:¶ÔÓÚINÊÂÎñ·µ»ØACK */ /* USB_INT_RET_NAK 0x001X1010B */ /* ´íÎó:·µ»ØNAK */ /* USB_INT_RET_STALL 0x001X1110B */ /* ´íÎó:·µ»ØSTALL */ /* USB_INT_RET_DATA0 0x001X0011B */ /* ´íÎó:¶ÔÓÚOUT/SETUPÊÂÎñ·µ»ØDATA0 */ /* USB_INT_RET_DATA1 0x001X1011B */ /* ´íÎó:¶ÔÓÚOUT/SETUPÊÂÎñ·µ»ØDATA1 */ /* USB_INT_RET_TOUT 0x001XXX00B */ /* ´íÎó:·µ»Ø³¬Ê± */

/* USB_INT_RET_TOGX 0x0010X011B */ /* ´íÎó:¶ÔÓÚINÊÂÎñ·µ»ØÊý¾Ý²»Í¬²½ */ /* USB_INT_RET_PID 0x001XXXXXB */ /* ´íÎó:䶨Òå */

/* ÒÔÏÂ״̬´úÂë1XHÓÃÓÚUSBÖ÷»ú·½Ê½µÄ²Ù×÷״̬´úÂë */ #ifndef USB_INT_SUCCESS #define USB_INT_SUCCESS #define USB_INT_CONNECT Á¬½Ó»òÕß¶Ï¿ªºóÖØÐÂÁ¬½Ó */ #define USB_INT_DISCONNECT #define USB_INT_BUF_OVER Òç³ö */

#define USB_INT_USB_READY */

0x14 0x15 0x16 0x17 0x18

/* USBÊÂÎñ»òÕß´«Êä²Ù×÷³É¹¦ */ /* ¼ì²âµ½USBÉ豸Á¬½Óʼþ, ¿ÉÄÜÊÇÐÂ/* ¼ì²âµ½USBÉ豸¶Ï¿ªÊ¼þ */

/* USB´«ÊäµÄÊý¾ÝÓÐÎó»òÕßÊý¾ÝÌ«¶à»º³åÇø/* USBÉ豸ÒѾ­±»³õʼ»¯(ÒѾ­·ÖÅäUSBµØÖ·)

#define USB_INT_DISK_READ 0x1D /* USB´æ´¢Æ÷ÇëÇóÊý¾Ý¶Á³ö */ #define USB_INT_DISK_WRITE 0x1E /* USB´æ´¢Æ÷ÇëÇóÊý¾ÝдÈë */ #define USB_INT_DISK_ERR 0x1F /* USB´æ´¢Æ÷²Ù×÷ʧ°Ü */ #endif

/* ÒÔÏÂ״̬´úÂëÓÃÓÚÖ÷»úÎļþģʽϵÄÎļþϵͳ´íÎóÂë */ #ifndef ERR_DISK_DISCON

#define ERR_DISK_DISCON 0x82 /* ´ÅÅÌÉÐδÁ¬½Ó,¿ÉÄÜ´ÅÅÌÒѾ­¶Ï¿ª */ #define ERR_LARGE_SECTOR 0x84 /* ´ÅÅ̵ÄÉÈÇøÌ«´ó,Ö»Ö§³ÖÿÉÈÇø512×Ö½Ú */

#define ERR_TYPE_ERROR 0x92 /* ´ÅÅÌ·ÖÇøÀàÐͲ»Ö§³Ö,Ö»Ö§³ÖFAT12/FAT16/BigDOS/FAT32,ÐèÒªÓÉ´ÅÅ̹ÜÀí¹¤¾ßÖØÐ·ÖÇø */ #define ERR_BPB_ERROR 0xA1 /* ´ÅÅÌÉÐδ¸ñʽ»¯,»òÕß²ÎÊý´íÎó,ÐèÒªÓÉWINDOWS²ÉÓÃĬÈϲÎÊýÖØÐ¸ñʽ»¯ */ #define ERR_DISK_FULL 0xB1 /* ´ÅÅÌÎļþÌ«Âú,Ê£Óà¿Õ¼äÌ«ÉÙ»òÕßÒѾ­Ã»ÓÐ,ÐèÒª´ÅÅÌÕûÀí */

#define ERR_FDT_OVER 0xB2 /* Ŀ¼(Îļþ¼Ð)ÄÚÎļþÌ«¶à,ûÓпÕÏеÄĿ¼Ïî,FAT12/FAT16¸ùĿ¼ÏµÄÎļþÊýÓ¦¸ÃÉÙÓÚ512¸ö,ÐèÒª´ÅÅÌÕûÀí */ #define ERR_FILE_CLOSE 0xB4 /* ÎļþÒѾ­¹Ø±Õ,Èç¹ûÐèҪʹÓÃ,Ó¦¸ÃÖØÐ´ò¿ªÎļþ */

#define ERR_OPEN_DIR 0x41 /* Ö¸¶¨Â·¾¶µÄĿ¼(Îļþ¼Ð)±»´ò¿ª */ #define ERR_MISS_FILE 0x42 /* Ö¸¶¨Â·¾¶µÄÎļþûÓÐÕÒµ½,¿ÉÄÜÊÇÎļþÃû³Æ´íÎó */

#define ERR_FOUND_NAME 0x43 /* ËÑË÷µ½ÏàÆ¥ÅäµÄÎļþÃû,»òÕßÊÇÒªÇó´ò¿ªÄ¿Â¼(Îļþ¼Ð)¶øÊµ¼Ê½á¹ûÈ´´ò¿ªÁËÎļþ */ /* ÒÔÏÂÎļþϵͳ´íÎóÂëÓÃÓÚÎļþϵͳ×Ó³ÌÐò */ #define ERR_MISS_DIR 0xB3 /* Ö¸¶¨Â·¾¶µÄij¸ö×ÓĿ¼(Îļþ¼Ð)ûÓÐÕÒµ½,¿ÉÄÜÊÇĿ¼Ãû³Æ´íÎó */

#define ERR_LONG_BUF_OVER 0x48 /* ³¤Îļþ»º³åÇøÒç³ö */ #define ERR_LONG_NAME_ERR 0x49 /* ¶ÌÎļþÃûûÓжÔÓ¦µÄ³¤ÎļþÃû»òÕß³¤ÎļþÃû´íÎó */

#define ERR_NAME_EXIST 0x4A /* ͬÃûµÄ¶ÌÎļþÒѾ­´æÔÚ,½¨ÒéÖØÐÂÉú³ÉÁíÍâÒ»¸ö¶ÌÎļþÃû */ #endif /*

********************************************************************************************************************* */

/* ÒÔÏÂ״̬´úÂëÓÃÓÚÖ÷»úÎļþģʽϵĴÅÅ̼°Îļþ״̬, VAR_DISK_STATUS */ #ifndef DEF_DISK_UNKNOWN #define DEF_DISK_UNKNOWN #define DEF_DISK_DISCONN #define DEF_DISK_CONNECT ʶ±ð¸Ã´ÅÅÌ */

#define DEF_DISK_MOUNTED ϵͳ»òÕßÎļþϵͳ²»Ö§³Ö */ #define DEF_DISK_READY */

0x00 0x01 0x02 0x03 0x10

/* ÉÐδ³õʼ»¯,δ֪״̬ */

/* ´ÅÅÌûÓÐÁ¬½Ó»òÕßÒѾ­¶Ï¿ª */

/* ´ÅÅÌÒѾ­Á¬½Ó,µ«ÊÇÉÐδ³õʼ»¯»òÕßÎÞ·¨/* ´ÅÅÌÒѾ­³õʼ»¯³É¹¦,µ«ÊÇÉÐδ·ÖÎöÎļþ/* ÒѾ­·ÖÎö´ÅÅ̵ÄÎļþϵͳ²¢ÇÒÄܹ»Ö§³Ö

#define DEF_DISK_OPEN_ROOT 0x12 /* ÒѾ­´ò¿ª¸ùĿ¼,ʹÓúó±ØÐë¹Ø±Õ,×¢ÒâFAT12/FAT16¸ùĿ¼Êǹ̶¨³¤¶È */ #define DEF_DISK_OPEN_DIR 0x13 /* ÒѾ­´ò¿ª×ÓĿ¼(Îļþ¼Ð) */ #define DEF_DISK_OPEN_FILE 0x14 /* ÒѾ­´ò¿ªÎļþ */ #endif /*

********************************************************************************************************************* */ /* Îļþϵͳ³£Óö¨Òå */

#ifndef DEF_SECTOR_SIZE #define DEF_SECTOR_SIZE 512 /* UÅÌ»òÕßSD¿¨Ä¬ÈϵÄÎïÀíÉÈÇøµÄ´óС */ #endif

#ifndef DEF_WILDCARD_CHAR

#define DEF_WILDCARD_CHAR 0x2A /* ·¾¶ÃûµÄͨÅä·û '*' */ #define DEF_SEPAR_CHAR1 0x5C /* ·¾¶ÃûµÄ·Ö¸ô·û '\\' */ #define DEF_SEPAR_CHAR2 0x2F /* ·¾¶ÃûµÄ·Ö¸ô·û '/' */ #define DEF_FILE_YEAR 2004 /* ĬÈÏÎļþÈÕÆÚ: 2004Äê */ #define DEF_FILE_MONTH 1 /* ĬÈÏÎļþÈÕÆÚ: 1Ô */ #define DEF_FILE_DATE 1 /* ĬÈÏÎļþÈÕÆÚ: 1ÈÕ */ #endif

#ifndef ATTR_DIRECTORY

/* FATÊý¾ÝÇøÖÐÎļþĿ¼ÐÅÏ¢ */ typedef struct _FAT_DIR_INFO { UINT8 DIR_Name[11]; */

UINT8 DIR_Attr; UINT8 DIR_NTRes; UINT8 DIR_CrtTimeTenth; UINT16 DIR_CrtTime; UINT16 DIR_CrtDate; UINT16 DIR_LstAccDate; UINT16 DIR_FstClusHI; UINT16 DIR_WrtTime; MAKE_FILE_TIME */ UINT16 DIR_WrtDate; MAKE_FILE_DATE */ UINT16 DIR_FstClusLO;

/* 00H,ÎļþÃû,¹²11×Ö½Ú,²»×ã´¦Ìî¿Õ¸ñ

/* 0BH,ÎļþÊôÐÔ,²Î¿¼ºóÃæµÄ˵Ã÷ */ /* 0CH */

/* 0DH,Îļþ´´½¨µÄʱ¼ä,ÒÔ0.1Ã뵥λ¼ÆÊý */ /* 0EH,Îļþ´´½¨µÄʱ¼ä */ /* 10H,Îļþ´´½¨µÄÈÕÆÚ */ /* 12H,×î½üÒ»´Î´æÈ¡²Ù×÷µÄÈÕÆÚ */ /* 14H */

/* 16H,ÎļþÐÞ¸Äʱ¼ä,²Î¿¼Ç°ÃæµÄºê/* 18H,ÎļþÐÞ¸ÄÈÕÆÚ,²Î¿¼Ç°ÃæµÄºê

/* 1AH */

UINT32 DIR_FileSize; /* 1CH,Îļþ³¤¶È */ } FAT_DIR_INFO, *P_FAT_DIR_INFO; /* 20H */

/* ÎļþÊôÐÔ */

#define ATTR_READ_ONLY 0x01 /* ÎļþΪֻ¶ÁÊôÐÔ */ #define ATTR_HIDDEN 0x02 /* ÎļþΪÒþº¬ÊôÐÔ */ #define ATTR_SYSTEM 0x04 /* ÎļþΪϵͳÊôÐÔ */ #define ATTR_VOLUME_ID 0x08 /* ¾í±ê */ #define ATTR_DIRECTORY 0x10 /* ×ÓĿ¼(Îļþ¼Ð) */ #define ATTR_ARCHIVE 0x20 /* ÎļþΪ´æµµÊôÐÔ */ #define ATTR_LONG_NAME ( ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID ) /* ³¤ÎļþÃûÊôÐÔ */ #define ATTR_LONG_NAME_MASK ( ATTR_LONG_NAME ATTR_ARCHIVE )

/* ÎļþÊôÐÔ UINT8 */

/* bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 */

/* Ö» Òþ ϵ ¾í Ä¿ ´æ 䶨Òå */ /* ¶Á ²Ø ͳ ±ê ¼ µµ */ /* Îļþʱ¼ä UINT16 */

/* Time = (Hour<<11) + (Minute<<5) + (Second>>1) */ #define MAKE_FILE_TIME( h, m, s ) ( (h<<11) + (m<<5) + (s>>1) ) /* Éú³ÉÖ¸¶¨Ê±·ÖÃëµÄÎļþʱ¼äÊý¾Ý */

/* ÎļþÈÕÆÚ UINT16 */

/* Date = ((Year-1980)<<9) + (Month<<5) + Day */ #define MAKE_FILE_DATE( y, m, d ) ( ((y-1980)<<9) + (m<<5) + d ) /* Éú³ÉÖ¸¶¨ÄêÔÂÈÕµÄÎļþÈÕÆÚÊý¾Ý */

#define LONE_NAME_MAX_CHAR (255*2) /* ³¤ÎļþÃû×î¶à×Ö·ûÊý/×Ö½ÚÊý */

|

ATTR_DIRECTORY

|

#define LONG_NAME_PER_DIR (13*2) /* ³¤ÎļþÃûÔÚÿ¸öÎļþĿ¼ÐÅÏ¢½á¹¹ÖеÄ×Ö·ûÊý/×Ö½ÚÊý */

#endif /*

********************************************************************************************************************* */ /* SCSIÃüÁîºÍÊý¾ÝÊäÈëÊä³ö½á¹¹ */

#ifndef SPC_CMD_INQUIRY

/* SCSIÃüÁîÂë */

#define SPC_CMD_INQUIRY #define SPC_CMD_READ_CAPACITY #define SPC_CMD_READ10 #define SPC_CMD_WRITE10 #define SPC_CMD_TEST_READY #define SPC_CMD_REQUEST_SENSE #define SPC_CMD_MODESENSE6 #define SPC_CMD_MODESENSE10 #define SPC_CMD_START_STOP

/* BulkOnlyЭÒéµÄÃüÁî¿é */ typedef struct _BULK_ONLY_CBW { UINT32 CBW_Sig; UINT32 CBW_Tag;

0x12

0x25 0x28 0x2A 0x00 0x03 0x1A 0x5A 0x1B

UINT8 CBW_DataLen0; /* 08H,ÊäÈë: Êý¾Ý´«Ê䳤¶È,¶ÔÓÚÊäÈëÊý¾ÝÆäÓÐЧֵÊÇ0µ½48,¶ÔÓÚÊä³öÊý¾ÝÆäÓÐЧֵΪ0µ½33 */ UINT8 CBW_DataLen1; UINT16 CBW_DataLen2; UINT8 CBW_Flag; /* 0CH,ÊäÈë: ´«Êä·½ÏòµÈ±êÖ¾,λ7Ϊ1ÔòÊäÈëÊý¾Ý,λΪ0ÔòÊä³öÊý¾Ý»òÕßûÓÐÊý¾Ý */ UINT8 CBW_LUN; UINT8 CBW_CB_Len; /* 0EH,ÊäÈë: ÃüÁî¿éµÄ³¤¶È,ÓÐЧֵÊÇ1µ½16 */ UINT8 CBW_CB_Buf[16]; /* 0FH,ÊäÈë: ÃüÁî¿é,¸Ã»º³åÇø×î¶àΪ16¸ö×Ö½Ú */

} BULK_ONLY_CBW, *P_BULK_ONLY_CBW; /* BulkOnlyЭÒéµÄÃüÁî¿é, ÊäÈëCBW½á¹¹ */

/* INQUIRYÃüÁîµÄ·µ»ØÊý¾Ý */ typedef struct _INQUIRY_DATA { UINT8 DeviceType; /* 00H, É豸ÀàÐÍ */

UINT8 RemovableMedia; UINT8 Versions; UINT8 DataFormatAndEtc; UINT8 AdditionalLength; UINT8 Reserved1; UINT8 Reserved2; UINT8 MiscFlag; UINT8 VendorIdStr[8]; UINT8 ProductIdStr[16]; UINT8 ProductRevStr[4]; } INQUIRY_DATA, *P_INQUIRY_DATA;

/* 01H, λ7Ϊ1˵Ã÷ÊÇÒÆ¶¯´æ´¢ */ /* 02H, ЭÒé°æ±¾ */

/* 03H, Ö¸¶¨·µ»ØÊý¾Ý¸ñʽ */ /* 04H, ºóÐøÊý¾ÝµÄ³¤¶È */

/* 07H, һЩ¿ØÖƱêÖ¾ */ /* 08H, ³§ÉÌÐÅÏ¢ */ /* 10H, ²úÆ·ÐÅÏ¢ */ /* 20H, ²úÆ·°æ±¾ */ /* 24H */

/* REQUEST SENSEÃüÁîµÄ·µ»ØÊý¾Ý */ typedef struct _SENSE_DATA {

UINT8 UINT8

ErrorCode; SegmentNumber;

/* 00H, ´íÎó´úÂë¼°ÓÐЧλ */

UINT8 SenseKeyAndEtc; /* 02H, Ö÷¼üÂë */ UINT8 Information0; UINT8 Information1; UINT8 Information2; UINT8 Information3; UINT8 AdditSenseLen; /* 07H, ºóÐøÊý¾ÝµÄ³¤¶È */ UINT8 CmdSpecInfo[4]; UINT8 AdditSenseCode; /* 0CH, ¸½¼Ó¼üÂë */ UINT8 AddSenCodeQual; /* 0DH, ÏêϸµÄ¸½¼Ó¼üÂë */ UINT8 FieldReplaUnit; UINT8 SenseKeySpec[3]; } SENSE_DATA, *P_SENSE_DATA; /* 12H */

#endif /*

********************************************************************************************************************* */ /* Ö÷»úÎļþģʽϵÄÊý¾ÝÊäÈëºÍÊä³ö½á¹¹ */

#ifndef MAX_FILE_NAME_LEN

#define MAX_FILE_NAME_LEN (13+1) /* ÎļþÃû×î´ó³¤¶È,×î´ó³¤¶ÈÊÇ1¸ö¸ùĿ¼·û+8¸öÖ÷ÎļþÃû+1¸öСÊýµã+3¸öÀàÐÍÃû+½áÊø·û=14 */

/* ÃüÁîµÄÊäÈëÊý¾ÝºÍÊä³öÊý¾Ý */ typedef union _CH376_CMD_DATA { struct {

UINT8 mBuffer[ MAX_FILE_NAME_LEN ]; } Default; INQUIRY_DATA DiskMountInq; /* ·µ»Ø: INQUIRYÃüÁîµÄ·µ»ØÊý¾Ý */ /* CMD0H_DISK_MOUNT: ³õʼ»¯´ÅÅ̲¢²âÊÔ´ÅÅÌÊÇ·ñ¾ÍÐ÷,Ê×´ÎÖ´ÐÐʱ */ FAT_DIR_INFO OpenDirInfo; /* ·µ»Ø: ö¾Ùµ½µÄÎļþĿ¼ÐÅÏ¢ */ /* CMD0H_FILE_OPEN: ö¾ÙÎļþºÍĿ¼(Îļþ¼Ð) */ FAT_DIR_INFO EnumDirInfo; /* ·µ»Ø: ö¾Ùµ½µÄÎļþĿ¼ÐÅÏ¢ */ /* CMD0H_FILE_ENUM_GO: ¼ÌÐøÃ¶¾ÙÎļþºÍĿ¼(Îļþ¼Ð) */ struct { UINT8 mUpdateFileSz; Ôò½ûÖ¹¸üг¤¶È */ } FileCLose; Îļþ */ struct {

/* ÊäÈë²ÎÊý: ÊÇ·ñÔÊÐí¸üÐÂÎļþ³¤¶È, 0

/* CMD1H_FILE_CLOSE: ¹Ø±Õµ±Ç°ÒѾ­´ò¿ªµÄ

UINT8 mDirInfoIndex; /* ÊäÈë²ÎÊý: Ö¸¶¨ÐèÒª¶ÁÈ¡µÄĿ¼ÐÅÏ¢½á¹¹ÔÚÉÈÇøÄÚµÄË÷ÒýºÅ, 0FFHÔòΪµ±Ç°ÒѾ­´ò¿ªµÄÎļþ */ } DirInfoRead; /* CMD1H_DIR_INFO_READ: ¶ÁÈ¡ÎļþµÄĿ¼ÐÅÏ¢ */ union { UINT32 mByteOffset; /* ÊäÈë²ÎÊý: Æ«ÒÆ×Ö½ÚÊý,ÒÔ×Ö½ÚΪµ¥Î»µÄÆ«ÒÆÁ¿(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */ UINT32 mSectorLba; /* ·µ»Ø: µ±Ç°ÎļþÖ¸Õë¶ÔÓ¦µÄ¾ø¶ÔÏßÐÔÉÈÇøºÅ,0FFFFFFFFHÔòÒѵ½Îļþβ(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */ } ByteLocate; /* CMD4H_BYTE_LOCATE: ÒÔ×Ö½ÚΪµ¥Î»Òƶ¯µ±Ç°ÎļþÖ¸Õë */ struct { UINT16 mByteCount; /* ÊäÈë²ÎÊý: ÇëÇó¶ÁÈ¡µÄ×Ö½ÚÊý(×ܳ¤¶È16λ,µÍ×Ö½ÚÔÚǰ) */ } ByteRead; /* CMD2H_BYTE_READ: ÒÔ×Ö½ÚΪµ¥Î»´Óµ±Ç°Î»ÖöÁÈ¡Êý¾Ý¿é */ struct { UINT16 mByteCount; /* ÊäÈë²ÎÊý: ÇëÇóдÈëµÄ×Ö½ÚÊý(×ܳ¤¶È16λ,µÍ×Ö½ÚÔÚǰ) */

} ByteWrite; ǰλÖÃдÈëÊý¾Ý¿é */ union {

/* CMD2H_BYTE_WRITE: ÒÔ×Ö½ÚΪµ¥Î»Ïòµ±

UINT32 mSectorOffset; /* ÊäÈë²ÎÊý: Æ«ÒÆÉÈÇøÊý,ÒÔÉÈÇøÎªµ¥Î»µÄÆ«ÒÆÁ¿(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */ UINT32 mSectorLba; /* ·µ»Ø: µ±Ç°ÎļþÖ¸Õë¶ÔÓ¦µÄ¾ø¶ÔÏßÐÔÉÈÇøºÅ,0FFFFFFFFHÔòÒѵ½Îļþβ(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */ } SectorLocate; ¶¯µ±Ç°ÎļþÖ¸Õë */ struct { UINT8 mSectorCount;

UINT8 mReserved1; UINT8 mReserved2;

UINT8

mReserved3;

UINT32 mStartSector; ÉÈÇøºÅ(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */ } SectorRead;

λÖöÁÈ¡Êý¾Ý¿é */ struct { UINT8 mSectorCount; UINT8 mReserved1; UINT8 mReserved2; UINT8 mReserved3; UINT32 mStartSector; ÉÈÇøºÅ(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */ } SectorWrite;

λÖÃдÈëÊý¾Ý¿é */ struct { UINT32 mDiskSizeSec; 32λ,µÍ×Ö½ÚÔÚǰ) */ } DiskCapacity;

Á¿ */ struct { UINT32 mTotalSector; λ,µÍ×Ö½ÚÔÚǰ) */ UINT32 mFreeSector;

32λ,µÍ×Ö½ÚÔÚǰ) */

/* CMD4H_SEC_LOCATE: ÒÔÉÈÇøÎªµ¥Î»ÒÆ /* ÊäÈë²ÎÊý: ÇëÇó¶ÁÈ¡µÄÉÈÇøÊý */

/* ·µ»Ø: ÔÊÐí¶ÁÈ¡µÄÉÈÇøÊý */

/* ·µ»Ø: ÔÊÐí¶ÁÈ¡µÄÉÈÇø¿éµÄÆðʼ¾ø¶ÔÏßÐÔ/* CMD1H_SEC_READ: ÒÔÉÈÇøÎªµ¥Î»´Óµ±Ç°

/* ÊäÈë²ÎÊý: ÇëÇóдÈëµÄÉÈÇøÊý */ /* ·µ»Ø: ÔÊÐíдÈëµÄÉÈÇøÊý */

/* ·µ»Ø: ÔÊÐíдÈëµÄÉÈÇø¿éµÄÆðʼ¾ø¶ÔÏßÐÔ/* CMD1H_SEC_WRITE: ÒÔÉÈÇøÎªµ¥Î»ÔÚµ±Ç°

/* ·µ»Ø: Õû¸öÎïÀí´ÅÅ̵Ä×ÜÉÈÇøÊý(×ܳ¤¶È/* CMD0H_DISK_CAPACITY: ²éѯ´ÅÅÌÎïÀíÈÝ

/* ·µ»Ø: µ±Ç°Âß¼­Å̵Ä×ÜÉÈÇøÊý(×ܳ¤¶È32/* ·µ»Ø: µ±Ç°Âß¼­Å̵ÄÊ£ÓàÉÈÇøÊý(×ܳ¤¶È

UINT8 mDiskFat; ÐÍ,1-FAT12,2-FAT16,3-FAT32 */ } DiskQuery;

BULK_ONLY_CBW DiskBocCbw;

Æ÷Ö´ÐÐBulkOnly´«ÊäЭÒéµÄÃüÁî */ struct { UINT8 mMaxLogicUnit; */ } DiskMaxLun;

USB´æ´¢Æ÷×î´óÂß¼­µ¥ÔªºÅ */

INQUIRY_DATA DiskInitInq;

*/ INQUIRY_DATA DiskInqData;

Æ÷ÌØÐÔ */

SENSE_DATA ReqSenseData;

*/

Æ÷´íÎó */ struct { UINT32 mDiskSizeSec; 32λ,¸ß×Ö½ÚÔÚǰ) */ } DiskSize;

ÈÝÁ¿ */ struct { UINT32 mStartSector; ½ÚÔÚǰ) */ UINT8 mSectorCount;

} DiskRead;

Êý¾Ý¿é(ÒÔÉÈÇøÎªµ¥Î») */ struct { UINT32 mStartSector; ½ÚÔÚǰ) */ UINT8 mSectorCount;

/* ·µ»Ø: µ±Ç°Âß¼­Å̵ÄFATÀà

/* CMD_DiskQuery, ²éѯ´ÅÅÌÐÅÏ¢ */ /* ÊäÈë²ÎÊý: CBWÃüÁî½á¹¹ */

/* CMD0H_DISK_BOC_CMD: ¶ÔUSB´æ´¢

/* ·µ»Ø: USB´æ´¢Æ÷µÄ×î´óÂß¼­µ¥ÔªºÅ/* CMD0H_DISK_MAX_LUN: ¿ØÖÆ´«Êä-»ñÈ¡

/* ·µ»Ø: INQUIRYÃüÁîµÄ·µ»ØÊý¾Ý */ /* CMD0H_DISK_INIT: ³õʼ»¯USB´æ´¢Æ÷/* ·µ»Ø: INQUIRYÃüÁîµÄ·µ»ØÊý¾Ý */ /* CMD0H_DISK_INQUIRY: ²éѯUSB´æ´¢

/* ·µ»Ø: REQUEST SENSEÃüÁîµÄ·µ»ØÊý¾Ý

/* CMD0H_DISK_R_SENSE: ¼ì²éUSB´æ´¢

/* ·µ»Ø: Õû¸öÎïÀí´ÅÅ̵Ä×ÜÉÈÇøÊý(×ܳ¤¶È

/* CMD0H_DISK_SIZE: »ñÈ¡USB´æ´¢Æ÷µÄ

/* ÊäÈë²ÎÊý: LBAÉÈÇøµØÖ·(×ܳ¤¶È32λ,µÍ×Ö /* ÊäÈë²ÎÊý: ÇëÇó¶ÁÈ¡µÄÉÈÇøÊý */

/* CMD5H_DISK_READ: ´ÓUSB´æ´¢Æ÷¶Á

/* ÊäÈë²ÎÊý: LBAÉÈÇøµØÖ·(×ܳ¤¶È32λ,µÍ×Ö

/* ÊäÈë²ÎÊý: ÇëÇóдÈëµÄÉÈÇøÊý */

} DiskWrite; /* CMD5H_DISK_WRITE: ÏòUSB´æ´¢Æ÷дÊý¾Ý¿é(ÒÔÉÈÇøÎªµ¥Î») */

} CH376_CMD_DATA, *P_CH376_CMD_DATA;

#endif /*

********************************************************************************************************************* */ /* Ö÷»úÎļþģʽϵÄÎļþϵͳ±äÁ¿µÄµØÖ· */

#ifndef VAR_FILE_SIZE

/* 8λ/µ¥×Ö½Ú±äÁ¿ */

#define VAR_SYS_BASE_INFO 0x20 /* µ±Ç°ÏµÍ³µÄ»ù±¾ÐÅÏ¢ */

/* λ6ÓÃÓÚָʾUSB´æ´¢É豸µÄ×ÓÀà±ðSubClass-Code, λ6Ϊ0Ôò˵Ã÷×ÓÀà±ðΪ6, λ6Ϊ1Ôò˵Ã÷×ÓÀà±ðÊÇ·Ç6µÄÆäËüÖµ */

/* λ5ÓÃÓÚָʾUSBÉ豸·½Ê½ÏµÄUSBÅäÖÃ״̬ºÍUSBÖ÷»ú·½Ê½ÏµÄUSBÉ豸Á¬½Ó״̬ */

/* USBÉ豸·½Ê½ÏÂ, λ5Ϊ1ÔòUSBÅäÖÃÍê³É, λ5λ0ÔòÉÐδÅäÖà */ /* USBÖ÷»ú·½Ê½ÏÂ, λ5Ϊ1ÔòUSB¶Ë¿Ú´æÔÚUSBÉ豸, λ5λ0ÔòUSB¶Ë¿ÚûÓÐUSBÉ豸 */

/* λ4ÓÃÓÚָʾUSBÉ豸·½Ê½ÏµĻº³åÇøËø¶¨×´Ì¬, λ4Ϊ1Ôò˵Ã÷USB»º³åÇø´¦ÓÚËø¶¨×´Ì¬, λ6Ϊ1Ôò˵Ã÷ÒѾ­ÊÍ·Å */ /* ÆäËüλ, ±£Áô,ÇëÎðÐÞ¸Ä */ #define VAR_RETRY_TIMES 0x25 /* USBÊÂÎñ²Ù×÷µÄÖØÊÔ´ÎÊý */

/* λ7Ϊ0ÔòÊÕµ½NAKʱ²»ÖØÊÔ, λ7Ϊ1λ6Ϊ0ÔòÊÕµ½NAKʱÎÞÏÞÖØÊÔ(¿ÉÒÔÓÃCMD_ABORT_NAKÃüÁî·ÅÆúÖØÊÔ), λ7Ϊ1λ6Ϊ1ÔòÊÕµ½NAKʱ×î¶àÖØÊÔ3Ãë */ /* λ5~λ0Ϊ³¬Ê±ºóµÄÖØÊÔ´ÎÊý */ #define VAR_FILE_BIT_FLAG 0x26 /* Ö÷»úÎļþģʽϵÄλ±êÖ¾ */

/* λ1ºÍλ0, Âß¼­Å̵ÄFATÎļþϵͳ±êÖ¾, 00-FAT12, 01-FAT16, 10-FAT32, 11-·Ç·¨ */

/* λ2, µ±Ç°»º³åÇøÖеÄFAT±íÊý¾ÝÊÇ·ñ±»Ð޸ıêÖ¾, 0-δÐÞ¸Ä, 1-ÒÑÐÞ¸Ä */ /* λ3, Îļþ³¤¶ÈÐèÒªÐ޸ıêÖ¾, µ±Ç°Îļþ±»×·¼ÓÊý¾Ý, 0-δ׷¼ÓÎÞÐèÐÞ¸Ä, 1-ÒÑ×·¼ÓÐèÒªÐÞ¸Ä */

/* ÆäËüλ, ±£Áô,ÇëÎðÐÞ¸Ä */ #define VAR_DISK_STATUS 0x2B /* Ö÷»úÎļþģʽϵĴÅÅ̼°Îļþ״̬ */ #define VAR_SD_BIT_FLAG 0x30 /* Ö÷»úÎļþģʽÏÂSD¿¨µÄλ±êÖ¾ */ /* λ0, SD¿¨°æ±¾, 0-Ö»Ö§³ÖSDµÚÒ»°æ,1-Ö§³ÖSDµÚ¶þ°æ */ /* λ1, ×Ô¶¯Ê¶±ð, 0-SD¿¨, 1-MMC¿¨ */

/* λ2, ×Ô¶¯Ê¶±ð, 0-±ê×¼ÈÝÁ¿SD¿¨, 1-´óÈÝÁ¿SD¿¨(HC-SD) */ /* λ4, ACMD41ÃüÁʱ */ /* λ5, CMD1ÃüÁʱ */ /* λ6, CMD58ÃüÁʱ */

/* ÆäËüλ, ±£Áô,ÇëÎðÐÞ¸Ä */ #define VAR_UDISK_TOGGLE 0x31 /* USB´æ´¢É豸µÄBULK-IN/BULK-OUT¶ËµãµÄͬ²½±êÖ¾ */

/* λ7, Bulk-In¶ËµãµÄͬ²½±êÖ¾ */ /* λ6, Bulk-In¶ËµãµÄͬ²½±êÖ¾ */ /* λ5~λ0, ±ØÐëΪ0 */ #define VAR_UDISK_LUN 0x34 /* USB´æ´¢É豸µÄÂß¼­µ¥ÔªºÅ */

/* λ7~λ4, USB´æ´¢É豸µÄµ±Ç°Âß¼­µ¥ÔªºÅ,CH376³õʼ»¯USB´æ´¢É豸ºó,ĬÈÏÊÇ·ÃÎÊ0#Âß¼­µ¥Ôª */

/* λ3~λ0, USB´æ´¢É豸µÄ×î´óÂß¼­µ¥ÔªºÅ,¼Ó1ºóµÈÓÚÂß¼­µ¥ÔªÊý */ #define VAR_SEC_PER_CLUS 0x38 /* Âß¼­Å̵Äÿ´ØÉÈÇøÊý */ #define VAR_FILE_DIR_INDEX 0x3B /* µ±Ç°ÎļþĿ¼ÐÅÏ¢ÔÚÉÈÇøÄÚµÄË÷ÒýºÅ */ #define VAR_CLUS_SEC_OFS 0x3C /* µ±Ç°ÎļþÖ¸ÕëÔÚ´ØÄÚµÄÉÈÇøÆ«ÒÆ,Ϊ0xFFÔòÖ¸ÏòÎļþĩβ,´Ø½áÊø */

/* 32λ/4×Ö½Ú±äÁ¿ */

#define VAR_DISK_ROOT 0x44 /* ¶ÔÓÚFAT16ÅÌΪ¸ùĿ¼ռÓÃÉÈÇøÊý,¶ÔÓÚFAT32ÅÌΪ¸ùĿ¼Æðʼ´ØºÅ(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */ #define VAR_DSK_TOTAL_CLUS 0x48 /* Âß¼­Å̵Ä×Ü´ØÊý(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */

#define VAR_DSK_START_LBA 0x4C /* Âß¼­ÅÌµÄÆðʼ¾ø¶ÔÉÈÇøºÅLBA(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */

#define VAR_DSK_DAT_START 0x50 /* Âß¼­Å̵ÄÊý¾ÝÇøÓòµÄÆðʼLBA(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */

#define VAR_LBA_BUFFER 0x54 /* µ±Ç°´ÅÅÌÊý¾Ý»º³åÇøµÄÊý¾Ý¶ÔÓ¦µÄLBA(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */ #define VAR_LBA_CURRENT 0x58 /* µ±Ç°¶ÁдµÄ´ÅÅÌÆðʼLBAµØÖ·(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */

#define VAR_FAT_DIR_LBA 0x5C /* µ±Ç°ÎļþĿ¼ÐÅÏ¢ËùÔÚµÄÉÈÇøLBAµØÖ·(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */

#define VAR_START_CLUSTER 0x60 /* µ±Ç°Îļþ»òÕßĿ¼(Îļþ¼Ð)µÄÆðʼ´ØºÅ(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */

#define VAR_CURRENT_CLUST 0x64 /* µ±Ç°ÎļþµÄµ±Ç°´ØºÅ(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */

#define VAR_FILE_SIZE 0x68 /* µ±Ç°ÎļþµÄ³¤¶È(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */ #define VAR_CURRENT_OFFSET 0x6C /* µ±Ç°ÎļþÖ¸Õë,µ±Ç°¶ÁдλÖõÄ×Ö½ÚÆ«ÒÆ(×ܳ¤¶È32λ,µÍ×Ö½ÚÔÚǰ) */

#endif /*

********************************************************************************************************************* */ /* ³£ÓÃUSB¶¨Òå */

/* USBµÄ°ü±êʶPID, Ö÷»ú·½Ê½¿ÉÄÜÓõ½ */ #ifndef DEF_USB_PID_SETUP #define DEF_USB_PID_NULL 0x00 #define DEF_USB_PID_SOF 0x05 #define DEF_USB_PID_SETUP 0x0D #define DEF_USB_PID_IN 0x09 #define DEF_USB_PID_OUT 0x01 #define DEF_USB_PID_ACK 0x02 #define DEF_USB_PID_NAK 0x0A #define DEF_USB_PID_STALL 0x0E #define DEF_USB_PID_DATA0 0x03 #define DEF_USB_PID_DATA1 0x0B #define DEF_USB_PID_PRE 0x0C #endif

/* USBÇëÇóÀàÐÍ, ÍâÖù̼þģʽ¿ÉÄÜÓõ½ */ #ifndef DEF_USB_REQ_TYPE

#define DEF_USB_REQ_READ 0x80 #define DEF_USB_REQ_WRITE 0x00 #define DEF_USB_REQ_TYPE 0x60 #define DEF_USB_REQ_STAND 0x00 #define DEF_USB_REQ_CLASS 0x20 #define DEF_USB_REQ_VENDOR 0x40 #define DEF_USB_REQ_RESERVE 0x60 #endif

/* ±£ÁôPID, 䶨Òå */

/* ¿ØÖƶÁ²Ù×÷ */ /* ¿ØÖÆÐ´²Ù×÷ */ /* ¿ØÖÆÇëÇóÀàÐÍ */ /* ±ê×¼ÇëÇó */ /* É豸ÀàÇëÇó */ /* ³§ÉÌÇëÇó */ /* ±£ÁôÇëÇó */

/* USB±ê×¼É豸ÇëÇó, RequestTypeµÄλ6λ5=00(Standard), ÍâÖù̼þģʽ¿ÉÄÜÓõ½ */ #ifndef DEF_USB_GET_DESCR

#define DEF_USB_CLR_FEATURE 0x01 #define DEF_USB_SET_FEATURE 0x03 #define DEF_USB_GET_STATUS 0x00 #define DEF_USB_SET_ADDRESS 0x05 #define DEF_USB_GET_DESCR 0x06 #define DEF_USB_SET_DESCR 0x07 #define DEF_USB_GET_CONFIG 0x08 #define DEF_USB_SET_CONFIG 0x09 #define DEF_USB_GET_INTERF 0x0A #define DEF_USB_SET_INTERF 0x0B #define DEF_USB_SYNC_FRAME 0x0C #endif /*

*******************************************************************************

************************************** */

#ifdef __cplusplus }

#endif

#endif

CH376HFT.CÎļþ

/* 2008.10.18

**************************************** ** Copyright (C) W.ch 1999-2009 ** ** Web: http://www.winchiphead.com ** **************************************** ** USB Host File Interface for CH376 **

** TC2.0@PC, KC7.0@MCS51 ** **************************************** */

/* CH376 Ö÷»úÎļþϵͳ½Ó¿Ú */

/* MCS-51µ¥Æ¬»úCÓïÑÔµÄUÅÌÎļþ¶ÁдʾÀý³ÌÐò */

/* ±¾³ÌÐòÑÝʾ×Ö½Ú¶Áд,Îļþö¾Ù,Îļþ¸´ÖÆ, ÓÃÓÚ½«UÅÌÖеÄ/C51/CH376HFT.CÎļþÖеÄСд×Öĸת³É´óд×Öĸºó, дµ½Ð½¨µÄÎļþNEWFILE.TXTÖÐ,

Èç¹ûÕÒ²»µ½Ô­ÎļþCH376HFT.C, ÄÇô¸Ã³ÌÐò½«ÏÔʾC51×ÓĿ¼ÏÂËùÓÐÒÔCH376¿ªÍ·µÄÎļþÃû, ²¢Ð½¨NEWFILE.TXTÎļþ²¢Ð´ÈëÌáʾÐÅÏ¢,

Èç¹ûÕÒ²»µ½C51×ÓĿ¼, ÄÇô¸Ã³ÌÐò½«ÏÔʾ¸ùĿ¼ÏµÄËùÓÐÎļþÃû, ²¢Ð½¨NEWFILE.TXTÎļþ²¢Ð´ÈëÌáʾÐÅÏ¢ */

/* C51 CH376HFT.C */ /* LX51 CH376HFT.OBJ */ /* OHX51 CH376HFT */

#include #include #include

#define EN_DISK_QUERY 1 /* ÆôÓôÅÅ̲éѯ */

#include \

#include \#include \

#include \

#include \ /* Èí¼þÄ£ÄâSPI·½Ê½ */ #include \#include \

UINT8 idata buf[64];

void main(void) { UINT8 i, s; UINT16 len; P_FAT_DIR_INFO pDir; UINT8 xdata SrcName[64]; UINT8 xdata TarName[64];

mDelaymS( 100 ); /* ÑÓʱ100ºÁÃë */

mInitSTDIO( ); /* ΪÁËÈüÆËã»úͨ¹ý´®¿Ú¼à¿ØÑÝʾ¹ý³Ì */ printf( \ϵͳÆô¶¯---Start\\n\

s = mInitCH376Host( ); /* ³õʼ»¯CH376 */ mStopIfError( s ); /* ÆäËüµç·³õʼ»¯ */ while ( 1 ) {

printf( \µÈ´ýUÅÌ»òÕßSD¿¨²åÈë---Wait Udisk/SD\\n\while ( CH376DiskConnect( ) != USB_INT_SUCCESS ) {

/* ¼ì²éUÅÌÊÇ·ñÁ¬½Ó,µÈ´ýUÅ̲åÈë,¶ÔÓÚSD¿¨,¿ÉÒÔÓɵ¥Æ¬»úÖ±½Ó²éѯSD¿¨×ùµÄ²å°Î״̬Òý½Å */ mDelaymS( 100 ); } mDelaymS( 200 ); /* ÑÓʱ,¿ÉÑ¡²Ù×÷,ÓеÄUSB´æ´¢Æ÷ÐèÒª¼¸Ê®ºÁÃëµÄÑÓʱ */ /* ¶ÔÓÚ¼ì²âµ½USBÉ豸µÄ,×î¶àµÈ´ý100*50mS,Ö÷ÒªÕë¶ÔÓÐЩMP3Ì«Âý,¶ÔÓÚ¼ì²âµ½USBÉ豸²¢ÇÒÁ¬½ÓDISK_MOUNTEDµÄ,×î¶àµÈ´ý5*50mS,Ö÷ÒªÕë¶ÔDiskReady²»¹ýµÄ */ for ( i = 0; i < 100; i ++ ) { /* ×µÈ´ýʱ¼ä,100*50mS */ mDelaymS( 50 ); printf( \×¼±¸ºÃÁË? ---- Ready ?\\n\ s = CH376DiskMount( ); /* ³õʼ»¯´ÅÅ̲¢²âÊÔ´ÅÅÌÊÇ·ñ¾ÍÐ÷ */ if ( s == USB_INT_SUCCESS ) break; /* ×¼±¸ºÃ */ else

if ( s == ERR_DISK_DISCON )

break; /* ¼ì²âµ½¶Ï¿ª,ÖØÐ¼ì²â²¢¼ÆÊ± */

if ( CH376GetDiskStatus( ) >= DEF_DISK_MOUNTED && i >= 5 )

break; /* ÓеÄUÅÌ×ÜÊÇ·µ»ØÎ´×¼±¸ºÃ,²»¹ý¿ÉÒÔºöÂÔ,Ö»ÒªÆä½¨Á¢Á¬½ÓMOUNTEDÇÒ³¢ÊÔ5*50mS */ } if ( s == ERR_DISK_DISCON ) {

}

/* ¼ì²âµ½¶Ï¿ª,ÖØÐ¼ì²â²¢¼ÆÊ± */ printf( \É豸ÒѶϿª---Device gone\\n\continue;

if ( CH376GetDiskStatus( ) < DEF_DISK_MOUNTED ) {

/* δ֪USBÉ豸,ÀýÈçUSB¼üÅÌ¡¢´òÓ¡»úµÈ */ printf( \ goto UnknownUsbDevice; } i = CH376ReadBlock( buf ); /* Èç¹ûÐèÒª,¿ÉÒÔ¶ÁÈ¡Êý¾Ý¿éCH376_CMD_DATA.DiskMountInq,·µ»Ø³¤¶È */ if ( i == sizeof( INQUIRY_DATA ) ) {

}

/* UÅ̵ij§É̺ͲúÆ·ÐÅÏ¢ */ buf[ i ] = 0;

printf( \Å̳§ÉÌ---UdiskInfo: %s\\n\

/* ¶ÁÈ¡Îļþ */ strcpy( SrcName, \ /* Ô´ÎļþÃû,¶à¼¶Ä¿Â¼ÏµÄÎļþÃûºÍ·¾¶Ãû±ØÐë¸´ÖÆµ½RAMÖÐÔÙ´¦Àí,¶ø¸ùĿ¼»òÕßµ±Ç°Ä¿Â¼ÏµÄÎļþÃû¿ÉÒÔÔÚRAM»òÕßROMÖÐ */ strcpy( TarName, \ /* Ä¿±êÎļþÃû */ printf( \´ò¿ªÎļþ --- Open\\n\ s = CH376FileOpenPath( SrcName ); /* ´ò¿ªÎļþ,¸ÃÎļþÔÚC51×ÓĿ¼Ï */ if ( s == ERR_MISS_DIR || s == ERR_MISS_FILE ) { /* ûÓÐÕÒµ½Ä¿Â¼»òÕßûÓÐÕÒµ½Îļþ */ /* ÁгöÎļþ,ÍêÕûö¾Ù¿ÉÒԲο¼EXAM13È«ÅÌö¾Ù */ if ( s == ERR_MISS_DIR ) strcpy( buf, \ /* C51×ÓĿ¼²»´æÔÚÔòÁгö¸ùĿ¼ÏµÄÎļþ */ else strcpy( buf, \); /* CH376HFT.CÎļþ²»´æÔÚÔòÁгö\\C51×Ó

Ŀ¼ÏµÄÒÔCH376¿ªÍ·µÄÎļþ */ printf( \ÁоÙËùÓÐÎļþ---List file %s\\n\ s = CH376FileOpenPath( buf ); /* ö¾Ù¶à¼¶Ä¿Â¼ÏµÄÎļþ»òÕßĿ¼,ÊäÈ뻺³åÇø±ØÐëÔÚRAMÖÐ */ while ( s == USB_INT_DISK_READ ) { /* ö¾Ùµ½Æ¥ÅäµÄÎļþ */ CH376ReadBlock( buf ); /* ¶Áȡö¾Ùµ½µÄÎļþµÄFAT_DIR_INFO½á¹¹,·µ»Ø³¤¶È×ÜÊÇsizeof( FAT_DIR_INFO ) */ pDir = (P_FAT_DIR_INFO)buf; /* µ±Ç°ÎļþĿ¼ÐÅÏ¢ */ if ( pDir -> DIR_Name[0] != '.' ) { /* ²»ÊDZ¾¼¶»òÕßÉϼ¶Ä¿Â¼ÃûÔò¼ÌÐø,·ñÔò±ØÐ붪Æú²»´¦Àí */ if ( pDir -> DIR_Name[0] == 0x05 ) pDir -> DIR_Name[0] = 0xE5; /* ÌØÊâ×Ö·ûÌæ»» */ pDir -> DIR_Attr = 0; /* Ç¿ÖÆÎļþÃû×Ö·û´®½áÊøÒÔ±ã´òÓ¡Êä³ö */ /* ´òÓ¡Ãû³Æ,ԭʼ8+3¸ñʽ,δÕûÀí³Éº¬Ð¡Êýµã·Ö¸ô·û */ printf( \ } xWriteCH376Cmd( CMD0H_FILE_ENUM_GO ); /* ¼ÌÐøÃ¶¾ÙÎļþºÍĿ¼ */ xEndCH376Cmd( ); s = Wait376Interrupt( ); } if ( s != ERR_MISS_FILE ) mStopIfError( s ); /* ²Ù×÷³ö´í */ /*--- н¨Ò»¸öÎļþ ---*/ printf( \ÐÂÎļþ±»´´½¨---Create\\n\ s = CH376FileCreatePath( TarName ); /* н¨¶à¼¶Ä¿Â¼ÏµÄÎļþ,Ö§³Ö¶à¼¶Ä¿Â¼Â·¾¶,ÊäÈ뻺³åÇø±ØÐëÔÚRAMÖÐ */ mStopIfError( s ); printf( \ÐÂÎļþ±»Ð´Èë---Write\\n\ strcpy( buf, \ÕÒ²»µ½/C51/CH376HFT.CÎļþ,»¶Ó­Ê¹ÓÃÒ»Ãùµç×ÓÄ£¿é!\\xd\\n\ s = CH376ByteWrite( buf, strlen(buf), NULL ); /* ÒÔ×Ö½ÚΪµ¥Î»Ïòµ±Ç°Î»ÖÃдÈëÊý¾Ý¿é */ mStopIfError( s ); printf( \ÐÂÎļþ±»¹Ø±Õ---Close\\n\ s = CH376FileClose( TRUE ); /* ¹Ø±ÕÎļþ,¶ÔÓÚ×Ö½Ú¶Áд½¨Òé×Ô¶¯¸üÐÂÎļþ³¤¶È */ mStopIfError( s ); printf(\

strcpy( TarName, \ /* Ä¿±êÎļþÃû */

/*--- н¨ÁíÍâÒ»¸öÎļþ£»ÎļþÃû£ºyimingtest.txt ---*/ printf( \´´½¨ÁíÍâÒ»¸öÎļþ---Create\\n\s = CH376FileCreatePath( TarName ); mStopIfError( s );

printf( \ÐÂÎļþ±»Ð´Èë----Write\\n\strcpy( buf, \¹§Ï²·¢²ÆÁË!\\xd\\n\

s = CH376ByteWrite( buf, strlen(buf) , NULL); mStopIfError ( s );

printf( \Îļþ±»¹Ø±Õ --- Close\\n\s = CH376FileClose(TRUE); mStopIfError( s );

/*--- ×·¼ÓÎļþÊý¾ÝµÄÀý×Ó ---*/ printf( \

strcpy( SrcName, \

s = CH376FileOpenPath( SrcName ); printf( \ if( s == USB_INT_SUCCESS ) {

//³É¹¦´ò¿ªÎļþ

strcpy( buf, \ÊDz»ÊÇÒªÇë¸çÃdzԷ¹ÁËÄØ?\\xd\\n\CH376ByteLocate(0xFFFFFFFF);

s = CH376ByteWrite( buf, strlen(buf) , NULL); mStopIfError ( s );

printf( \Îļþ±»¹Ø±Õ --- Close\\n\ s = CH376FileClose(TRUE); mStopIfError( s ); } else mStopIfError( s ); /*--- ¶ÁÈ¡ÎļþÊý¾ÝµÄÀý×Ó ---*/ printf( \

printf( \¶ÁÈ¡ÎļþÊý¾ÝµÄÀý×Ó:\\n\strcpy( SrcName, \

s = CH376FileOpenPath( SrcName ); printf( \ if( s == USB_INT_SUCCESS ) { len = CH376GetFileSize(); CH376ByteLocate( 0 ); CH376ByteRead(buf,len,NULL); printf( \

mStopIfError ( s ); printf( \Îļþ±»¹Ø±Õ --- Close\\n\ s = CH376FileClose(TRUE); mStopIfError( s ); } else mStopIfError( s ); } else { /* ÕÒµ½Îļþ»òÕß³ö´í */ mStopIfError( s ); }

UnknownUsbDevice: }

}

printf( \É豸°Î³ö --- Take out\\n\

while ( CH376DiskConnect( ) == USB_INT_SUCCESS ) { /* ¼ì²éUÅÌÊÇ·ñÁ¬½Ó,µÈ´ýUÅ̰γö */ mDelaymS( 100 ); }

mDelaymS( 200 );

SPI_SW.C Îļþ

/* CH376оƬ Èí¼þÄ£ÄâSPI´®ÐÐÁ¬½ÓµÄÓ²¼þ³éÏó²ã V1.0 */ /* ÌṩI/O½Ó¿Ú×Ó³ÌÐò */

#include \

/* ±¾ÀýÖеÄÓ²¼þÁ¬½Ó·½Ê½ÈçÏÂ(ʵ¼ÊÓ¦Óõç·¿ÉÒÔ²ÎÕÕÐÞ¸ÄÏÂÊö¶¨Òå¼°×Ó³ÌÐò) */ /* µ¥Æ¬»úµÄÒý½Å CH376оƬµÄÒý½Å P1.4 SCS P1.5 SDI P1.6 SDO

P1.7 SCK */ sbit P24 = P2^4; sbit P25 = P2^5; sbit P26 = P2^6;

sbit P27 = P2^7;

#define CH376_SPI_SCS P24 /* ¼Ù¶¨CH376µÄSCSÒý½Å */ #define CH376_SPI_SDI P25 /* ¼Ù¶¨CH376µÄSDIÒý½Å */ #define CH376_SPI_SDO P26 /* ¼Ù¶¨CH376µÄSDOÒý½Å */ #define CH376_SPI_SCK P27 /* ¼Ù¶¨CH376µÄSCKÒý½Å */

#define CH376_INT_WIRE INT0 /* ¼Ù¶¨CH376µÄINT#Òý½Å,Èç¹ûδÁ¬½ÓÄÇôҲ¿ÉÒÔͨ¹ý²éѯ¼æ×öÖжÏÊä³öµÄSDOÒý½Å״̬ʵÏÖ */

void CH376_PORT_INIT( void ) /* ÓÉÓÚʹÓÃÈí¼þÄ£ÄâSPI¶ÁдʱÐò,ËùÒÔ½øÐгõʼ»¯ */ {

/* Èç¹ûÊÇÓ²¼þSPI½Ó¿Ú,ÄÇô¿ÉʹÓÃmode3(CPOL=1&CPHA=1)»òmode0(CPOL=0&CPHA=0),CH376ÔÚʱÖÓÉÏÉýÑØ²ÉÑùÊäÈë,ϽµÑØÊä³ö,Êý¾ÝλÊǸßλÔÚǰ */ CH376_SPI_SCS = 1; /* ½ûÖ¹SPIƬѡ */ CH376_SPI_SCK = 1; /* ĬÈÏΪ¸ßµçƽ,SPIģʽ3,Ò²¿ÉÒÔÓÃSPIģʽ0,µ«Ä£Äâ³ÌÐò¿ÉÄÜÐèÉÔ×öÐÞ¸Ä */

/* ¶ÔÓÚË«ÏòI/OÒý½ÅÄ£ÄâSPI½Ó¿Ú,ÄÇô±ØÐëÔÚ´ËÉèÖÃSPI_SCS,SPI_SCK,SPI_SDIΪÊä³ö·½Ïò,SPI_SDOΪÊäÈë·½Ïò */ }

void mDelay0_5uS( void ) /* ÖÁÉÙÑÓʱ0.5uS,¸ù¾Ýµ¥Æ¬»úÖ÷Ƶµ÷Õû */ { }

void Spi376OutByte( UINT8 d ) /* SPIÊä³ö8¸öλÊý¾Ý */ { /* Èç¹ûÊÇÓ²¼þSPI½Ó¿Ú,Ó¦¸ÃÊÇÏȽ«Êý¾ÝдÈëSPIÊý¾Ý¼Ä´æÆ÷,È»ºó²éѯSPI״̬¼Ä´æÆ÷ÒԵȴýSPI×Ö½Ú´«ÊäÍê³É */ UINT8 i; for ( i = 0; i < 8; i ++ ) { CH376_SPI_SCK = 0; if ( d & 0x80 ) CH376_SPI_SDI = 1; else CH376_SPI_SDI = 0; d <<= 1; /* Êý¾ÝλÊǸßλÔÚǰ */ CH376_SPI_SCK = 1; /* CH376ÔÚʱÖÓÉÏÉýÑØ²ÉÑùÊäÈë */ } }

UINT8 Spi376InByte( void ) /* SPIÊäÈë8¸öλÊý¾Ý */ {

/* Èç¹ûÊÇÓ²¼þSPI½Ó¿Ú,Ó¦¸ÃÊÇÏȲéѯSPI״̬¼Ä´æÆ÷ÒԵȴýSPI×Ö½Ú´«ÊäÍê³É,È»ºó´ÓSPIÊý¾Ý¼Ä´æÆ÷¶Á³öÊý¾Ý */ UINT8 i, d; d = 0; for ( i = 0; i < 8; i ++ ) { CH376_SPI_SCK = 0; /* CH376ÔÚʱÖÓϽµÑØÊä³ö */ d <<= 1; /* Êý¾ÝλÊǸßλÔÚǰ */ if ( CH376_SPI_SDO ) d ++; CH376_SPI_SCK = 1; } return( d ); }

#define xEndCH376Cmd( ) { CH376_SPI_SCS = 1; } /* SPIƬѡÎÞЧ,½áÊøCH376ÃüÁî,½öÓÃÓÚSPI½Ó¿Ú·½Ê½ */

void xWriteCH376Cmd( UINT8 mCmd ) /* ÏòCH376дÃüÁî */ {

CH376_SPI_SCS = 1; /* ·Àֹ֮ǰδͨ¹ýxEndCH376Cmd½ûÖ¹SPIƬѡ */ mDelay0_5uS( );

/* ¶ÔÓÚË«ÏòI/OÒý½ÅÄ£ÄâSPI½Ó¿Ú,ÄÇô±ØÐëÈ·±£ÒѾ­ÉèÖÃSPI_SCS,SPI_SCK,SPI_SDIΪÊä³ö·½Ïò,SPI_SDOΪÊäÈë·½Ïò */ CH376_SPI_SCS = 0; /* SPIƬѡÓÐЧ */ Spi376OutByte( mCmd ); /* ·¢³öÃüÁîÂë */

/* ÑÓʱ1.5uSÈ·±£¶ÁдÖÜÆÚ´óÓÚ1.5uS,»òÕßÓÃÉÏÃæÒ»ÐеÄ״̬²éѯ´úÌæ */ mDelay0_5uS( ); mDelay0_5uS( ); mDelay0_5uS( ); }

#ifdef FOR_LOW_SPEED_MCU /* ²»ÐèÒªÑÓʱ */

#define xWriteCH376Data( d ) { Spi376OutByte( d ); } /* ÏòCH376дÊý¾Ý */ #define xReadCH376Data( ) ( Spi376InByte( ) ) /* ´ÓCH376¶ÁÊý¾Ý */ #else

void xWriteCH376Data( UINT8 mData ) /* ÏòCH376дÊý¾Ý */ { Spi376OutByte( mData ); }

UINT8 xReadCH376Data( void ) /* ´ÓCH376¶ÁÊý¾Ý */ { return( Spi376InByte( ) );

}

#endif

/* ²éѯCH376ÖжÏ(INT#µÍµçƽ) */ UINT8 Query376Interrupt( void ) { /* Èç¹ûÁ¬½ÓÁËCH376µÄÖжÏÒý½ÅÔòÖ±½Ó²éѯÖжÏÒý½Å */ return( CH376_INT_WIRE ? FALSE : TRUE ); }

UINT8 mInitCH376Host( void ) /* ³õʼ»¯CH376 */ { UINT8 res;

CH376_PORT_INIT( ); /* ½Ó¿ÚÓ²¼þ³õʼ»¯ */ xWriteCH376Cmd( CMD11_CHECK_EXIST ); /* ²âÊÔµ¥Æ¬»úÓëCH376Ö®¼äµÄͨѶ½Ó¿Ú */ xWriteCH376Data( 0x65 ); //0110 0101 res = xReadCH376Data( ); xEndCH376Cmd( ); if ( res != 0x9A ) //1001 1010 return( ERR_USB_UNKNOWN ); /* ͨѶ½Ó¿Ú²»Õý³£,¿ÉÄÜÔ­ÒòÓÐ:½Ó¿ÚÁ¬½ÓÒì³£,ÆäËüÉ豸ӰÏì(Ƭѡ²»Î¨Ò»),´®¿Ú²¨ÌØÂÊ,Ò»Ö±ÔÚ¸´Î»,¾§Õñ²»¹¤×÷ */ }

xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* É豸USB¹¤×÷ģʽ */ xWriteCH376Data( 0x06 ); mDelayuS( 20 );

/*--- ÉèÖÃCH376¹¤×÷ģʽ֮ºó£¬¶ÁÈ¡Æä½á¹û״̬ ---*/ res = xReadCH376Data( ); xEndCH376Cmd( );

if ( res == CMD_RET_SUCCESS ) return( USB_INT_SUCCESS ); else

return( ERR_USB_UNKNOWN ); /* ÉèÖÃģʽ´íÎó */

FILE_SYS.HÎļþ

/* CH376оƬ Îļþϵͳ²ã V1.0 */

/* ÌṩÎļþϵͳ³£ÓÃ×Ó³ÌÐò,ÌṩÃüÁî´ò°ü */

/* ²»Ê¹ÓõÄ×Ó³ÌÐò¿ÉÒÔ×¢Ê͵ô,´Ó¶ø½ÚÔ¼µ¥Æ¬»úµÄ³ÌÐòROM¿Õ¼äºÍÊý¾ÝRAM¿Õ¼ä */

/* ÕâÀïµÄ×Ó³ÌÐòÊÇͨ¹ýÀ¨ºÅÖеıäÁ¿´«µÝ²ÎÊý,Èç¹û²ÎÊý½Ï¶à,ΪÁ˽ÚÔ¼RAM,Ò²¿ÉÒԲο¼CH375×Ó³ÌÐò¿â¸Ä³Éͨ¹ýͬһȫ¾Ö±äÁ¿/ÁªºÏ½á¹¹CH376_CMD_DATA´«µÝ */

/* name ²ÎÊýÊÇÖ¸¶ÌÎļþÃû, ¿ÉÒÔ°üÀ¨¸ùĿ¼·û, µ«²»º¬Óз¾¶·Ö¸ô·û, ×ܳ¤¶È²»³¬¹ý

1+8+1+3+1×Ö½Ú */

/* PathName ²ÎÊýÊÇָȫ·¾¶µÄ¶ÌÎļþÃû, °üÀ¨¸ùĿ¼·û¡¢¶à¼¶×ÓĿ¼¼°Â·¾¶·Ö¸ô·û¡¢ÎļþÃû/Ŀ¼Ãû */

/* LongName ²ÎÊýÊÇÖ¸³¤ÎļþÃû, ÒÔUNICODEС¶Ë˳Ðò±àÂë, ÒÔÁ½¸ö0×Ö½Ú½áÊø, ʹÓó¤ÎļþÃû×Ó³ÌÐò±ØÐëÏȶ¨ÒåÈ«¾Ö»º³åÇøGlobalBuf, ³¤¶È²»Ð¡ÓÚ64×Ö½Ú, ¿ÉÒÔÓëÆäËü×Ó³ÌÐò¹²Óà */

/* ¶¨Òå NO_DEFAULT_CH376_INT ÓÃÓÚ½ûֹĬÈϵÄWait376Interrupt×Ó³ÌÐò,½ûÖ¹ºó,Ó¦ÓóÌÐò±ØÐë×ÔÐж¨ÒåÒ»¸öͬÃû×Ó³ÌÐò */

/* ¶¨Òå DEF_INT_TIMEOUT ÓÃÓÚÉèÖÃĬÈϵÄWait376Interrupt×Ó³ÌÐòÖеĵȴýÖжϵij¬Ê±Ê±¼ä/Ñ­»·¼ÆÊýÖµ, 0Ôò²»¼ì²é³¬Ê±¶øÒ»Ö±µÈ´ý */

/* ¶¨Òå EN_DIR_CREATE ÓÃÓÚÌṩн¨¶à¼¶×ÓĿ¼µÄ×Ó³ÌÐò,ĬÈÏÊDz»Ìṩ */

/* ¶¨Òå EN_DISK_QUERY ÓÃÓÚÌṩ´ÅÅÌÈÝÁ¿²éѯºÍÊ£Óà¿Õ¼ä²éѯµÄ×Ó³ÌÐò,ĬÈÏÊDz»Ìṩ */

/* ¶¨Òå EN_SECTOR_ACCESS ÓÃÓÚÌṩÒÔÉÈÇøÎªµ¥Î»¶ÁдÎļþµÄ×Ó³ÌÐò,ĬÈÏÊDz»Ìṩ */ /* ¶¨Òå EN_LONG_NAME ÓÃÓÚÌṩ֧³Ö³¤ÎļþÃûµÄ×Ó³ÌÐò,ĬÈÏÊDz»Ìṩ */

#ifndef __CH376_FS_H__ #define __CH376_FS_H__

#include \

#define STRUCT_OFFSET( s, m ) ( (UINT8)( & ((s *)0) -> m ) ) /* ¶¨Òå»ñÈ¡½á¹¹³ÉÔ±Ïà¶ÔÆ«ÒÆµØÖ·µÄºê */

#ifdef EN_LONG_NAME

#ifndef LONG_NAME_BUF_LEN

#define LONG_NAME_BUF_LEN ( LONG_NAME_PER_DIR * 20 ) /* ×ÔÐж¨ÒåµÄ³¤ÎļþÃû»º³åÇø³¤¶È,×îСֵΪLONG_NAME_PER_DIR*1 */ #endif #endif

UINT8 CH376ReadBlock( PUINT8 buf ); /* ´Óµ±Ç°Ö÷»ú¶ËµãµÄ½ÓÊÕ»º³åÇø¶ÁÈ¡Êý¾Ý¿é,·µ»Ø³¤¶È */

UINT8 CH376WriteReqBlock( PUINT8 buf ); /* ÏòÄÚ²¿Ö¸¶¨»º³åÇøÐ´ÈëÇëÇóµÄÊý¾Ý¿é,·µ»Ø³¤¶È */

void CH376WriteHostBlock( PUINT8 buf, UINT8 len ); /* ÏòUSBÖ÷»ú¶ËµãµÄ·¢ËÍ»º³åÇøÐ´ÈëÊý¾Ý¿é */

void CH376WriteOfsBlock( PUINT8 buf, UINT8 ofs, UINT8 len ); /* ÏòÄÚ²¿»º³åÇøÖ¸¶¨Æ«ÒƵØÖ·Ð´ÈëÊý¾Ý¿é */

void CH376SetFileName( PUINT8 name ); /* ÉèÖý«Òª²Ù×÷µÄÎļþµÄÎļþÃû */

UINT32 CH376Read32bitDat( void ); /* ´ÓCH376оƬ¶ÁÈ¡32λµÄÊý¾Ý²¢½áÊøÃüÁî */

UINT8 CH376ReadVar8( UINT8 var ); /* ¶ÁCH376оƬÄÚ²¿µÄ8λ±äÁ¿ */

void CH376WriteVar8( UINT8 var, UINT8 dat ); /* дCH376оƬÄÚ²¿µÄ8λ±äÁ¿ */

UINT32 CH376ReadVar32( UINT8 var ); /* ¶ÁCH376оƬÄÚ²¿µÄ32λ±äÁ¿ */

void CH376WriteVar32( UINT8 var, UINT32 dat ); /* дCH376оƬÄÚ²¿µÄ32λ±äÁ¿ */

void CH376EndDirInfo( void ); /* ÔÚµ÷ÓÃCH376DirInfoRead»ñÈ¡FAT_DIR_INFO½á¹¹Ö®ºóÓ¦¸Ã֪ͨCH376½áÊø */

UINT32 CH376GetFileSize( void ); /* ¶ÁÈ¡µ±Ç°Îļþ³¤¶È */

UINT8 CH376GetDiskStatus( void ); /* »ñÈ¡´ÅÅ̺ÍÎļþϵͳµÄ¹¤×÷״̬ */

UINT8 CH376GetIntStatus( void ); /* »ñÈ¡ÖжÏ״̬²¢È¡ÏûÖжÏÇëÇó */

#ifndef NO_DEFAULT_CH376_INT

UINT8 Wait376Interrupt( void ); /* µÈ´ýCH376ÖжÏ(INT#µÍµçƽ)£¬·µ»ØÖжÏ״̬Âë, ³¬Ê±Ôò·µ»ØERR_USB_UNKNOWN */ #endif

UINT8 CH376SendCmdWaitInt( UINT8 mCmd ); /* ·¢³öÃüÁîÂëºó,µÈ´ýÖÐ¶Ï */

UINT8 CH376SendCmdDatWaitInt( UINT8 mCmd, UINT8 mDat ); /* ·¢³öÃüÁîÂëºÍÒ»×Ö½ÚÊý¾Ýºó,µÈ´ýÖÐ¶Ï */

UINT8 CH376DiskReqSense( void ); /* ¼ì²éUSB´æ´¢Æ÷´íÎó */

UINT8 CH376DiskConnect( void ); /* ¼ì²éUÅÌÊÇ·ñÁ¬½Ó,²»Ö§³ÖSD¿¨ */

UINT8 CH376DiskMount( void ); /* ³õʼ»¯´ÅÅ̲¢²âÊÔ´ÅÅÌÊÇ·ñ¾ÍÐ÷ */

UINT8 CH376FileOpen( PUINT8 name ); /* ÔÚ¸ùĿ¼»òÕßµ±Ç°Ä¿Â¼Ï´ò¿ªÎļþ»òÕßĿ¼(Îļþ¼Ð) */

UINT8 CH376FileCreate( PUINT8 name ); /* ÔÚ¸ùĿ¼»òÕßµ±Ç°Ä¿Â¼ÏÂн¨Îļþ,Èç¹ûÎļþÒѾ­´æÔÚÄÇôÏÈɾ³ý */

UINT8 CH376DirCreate( PUINT8 name ); /* ÔÚ¸ùĿ¼ÏÂн¨Ä¿Â¼(Îļþ¼Ð)²¢´ò¿ª,Èç¹ûĿ¼ÒѾ­´æÔÚÄÇôֱ½Ó´ò¿ª */

UINT8 CH376SeparatePath( PUINT8 path ); /* ´Ó·¾¶ÖзÖÀë³ö×îºóÒ»¼¶ÎļþÃû»òÕßĿ¼(Îļþ¼Ð)Ãû,·µ»Ø×îºóÒ»¼¶ÎļþÃû»òÕßĿ¼ÃûµÄ×Ö½ÚÆ«ÒÆ */

UINT8 CH376FileOpenDir( PUINT8 PathName, UINT8 StopName ); /* ´ò¿ª¶à¼¶Ä¿Â¼ÏµÄÎļþ»òÕßĿ¼µÄÉϼ¶Ä¿Â¼,Ö§³Ö¶à¼¶Ä¿Â¼Â·¾¶,Ö§³Ö·¾¶·Ö¸ô·û,·¾¶³¤¶È²»³¬¹ý255¸ö×Ö·û */ /* StopName Ö¸Ïò×îºóÒ»¼¶ÎļþÃû»òÕßĿ¼Ãû */

UINT8 CH376FileOpenPath( PUINT8 PathName ); /* ´ò¿ª¶à¼¶Ä¿Â¼ÏµÄÎļþ»òÕßĿ¼(Îļþ¼Ð),Ö§³Ö¶à¼¶Ä¿Â¼Â·¾¶,Ö§³Ö·¾¶·Ö¸ô·û,·¾¶³¤¶È²»³¬¹ý255¸ö×Ö·û */

UINT8 CH376FileCreatePath( PUINT8 PathName ); /* н¨¶à¼¶Ä¿Â¼ÏµÄÎļþ,Ö§³Ö¶à¼¶Ä¿Â¼Â·¾¶,Ö§³Ö·¾¶·Ö¸ô·û,·¾¶³¤¶È²»³¬¹ý255¸ö×Ö·û */

#ifdef EN_DIR_CREATE

UINT8 CH376DirCreatePath( PUINT8 PathName ); /* н¨¶à¼¶Ä¿Â¼ÏµÄĿ¼(Îļþ¼Ð)²¢´ò¿ª,Ö§³Ö¶à¼¶Ä¿Â¼Â·¾¶,Ö§³Ö·¾¶·Ö¸ô·û,·¾¶³¤¶È²»³¬¹ý255¸ö×Ö·û */ #endif

UINT8 CH376FileErase( PUINT8 PathName ); /* ɾ³ýÎļþ,Èç¹ûÒѾ­´ò¿ªÔòÖ±½Óɾ³ý,·ñÔò¶ÔÓÚÎļþ»áÏÈ´ò¿ªÔÙɾ³ý,Ö§³Ö¶à¼¶Ä¿Â¼Â·¾¶ */ UINT8 */

CH376FileClose( UINT8 UpdateSz ); /* ¹Ø±Õµ±Ç°ÒѾ­´ò¿ªµÄÎļþ»òÕßĿ¼(Îļþ¼Ð)

UINT8 CH376DirInfoRead( void ); /* ¶ÁÈ¡µ±Ç°ÎļþµÄĿ¼ÐÅÏ¢ */

UINT8 CH376DirInfoSave( void ); /* ±£´æÎļþµÄĿ¼ÐÅÏ¢ */

UINT8 CH376ByteLocate( UINT32 offset ); /* ÒÔ×Ö½ÚΪµ¥Î»Òƶ¯µ±Ç°ÎļþÖ¸Õë */

UINT8 CH376ByteRead( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ); /* ÒÔ×Ö½ÚΪµ¥Î»´Óµ±Ç°Î»ÖöÁÈ¡Êý¾Ý¿é */

UINT8 CH376ByteWrite( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ); /* ÒÔ×Ö½ÚΪµ¥Î»Ïòµ±Ç°Î»ÖÃдÈëÊý¾Ý¿é */

#ifdef EN_DISK_QUERY

UINT8 CH376DiskCapacity( PUINT32 DiskCap ); /* ²éѯ´ÅÅÌÎïÀíÈÝÁ¿,ÉÈÇøÊý */

UINT8 CH376DiskQuery( PUINT32 DiskFre ); /* ²éѯ´ÅÅÌÊ£Óà¿Õ¼äÐÅÏ¢,ÉÈÇøÊý */

#endif

UINT8 CH376SecLocate( UINT32 offset ); /* ÒÔÉÈÇøÎªµ¥Î»Òƶ¯µ±Ç°ÎļþÖ¸Õë */

#ifdef EN_SECTOR_ACCESS

UINT8 CH376DiskReadSec( PUINT8 buf, UINT32 iLbaStart, UINT8 iSectorCount ); /* ´ÓUÅ̶ÁÈ¡¶à¸öÉÈÇøµÄÊý¾Ý¿éµ½»º³åÇø,²»Ö§³ÖSD¿¨ */

UINT8 CH376DiskWriteSec( PUINT8 buf, UINT32 iLbaStart, UINT8 iSectorCount ); /* ½«»º³åÇøÖеĶà¸öÉÈÇøµÄÊý¾Ý¿éдÈëUÅÌ,²»Ö§³ÖSD¿¨ */

UINT8 CH376SecRead( PUINT8 buf, UINT8 ReqCount, PUINT8 RealCount ); /* ÒÔÉÈÇøÎªµ¥Î»´Óµ±Ç°Î»ÖöÁÈ¡Êý¾Ý¿é,²»Ö§³ÖSD¿¨ */

UINT8 CH376SecWrite( PUINT8 buf, UINT8 ReqCount, PUINT8 RealCount ); /* ÒÔÉÈÇøÎªµ¥Î»ÔÚµ±Ç°Î»ÖÃдÈëÊý¾Ý¿é,²»Ö§³ÖSD¿¨ */

#endif

#ifdef EN_LONG_NAME

UINT8 CH376LongNameWrite( PUINT8 buf, UINT16 ReqCount ); /* ³¤ÎļþÃûרÓõÄ×Ö½Úд×Ó³ÌÐò */

UINT8 CH376CheckNameSum( PUINT8 DirName ); /* ¼ÆË㳤ÎļþÃûµÄ¶ÌÎļþÃû¼ìÑéºÍ,ÊäÈëΪÎÞСÊýµã·Ö¸ô·ûµÄ¹Ì¶¨11×Ö½Ú¸ñʽ */

UINT8 CH376LocateInUpDir( PUINT8 PathName ); /* ÔÚÉϼ¶Ä¿Â¼(Îļþ¼Ð)ÖÐÒÆ¶¯ÎļþÖ¸Õëµ½µ±Ç°ÎļþĿ¼ÐÅÏ¢ËùÔÚµÄÉÈÇø */

/* ÁíÍâ,˳±ã½«µ±Ç°ÎļþĿ¼ÐÅÏ¢ËùÔÚµÄÉÈÇøµÄǰһ¸öÉÈÇøµÄLBAµØÖ·Ð´ÈëCH376ÄÚ²¿VAR_FAT_DIR_LBA±äÁ¿(ΪÁË·½±ãÊÕ¼¯³¤ÎļþÃûʱÏòǰËÑË÷,·ñÔòÒª¶àÒÆ¶¯Ò»´Î) */ /* ʹÓÃÁËÈ«¾Ö»º³åÇøGlobalBufµÄǰ12¸ö×Ö½Ú */

UINT8 CH376GetLongName( PUINT8 PathName, PUINT8 LongName ); /* ÓɶÌÎļþÃû»òÕßĿ¼(Îļþ¼Ð)Ãû»ñµÃÏàÓ¦µÄ³¤ÎļþÃû */

/* ÐèÒªÊäÈë¶ÌÎļþÃûµÄÍêÕû·¾¶PathName,ÐèÒªÌṩ»º³åÇø½ÓÊÕ³¤ÎļþÃûLongName(ÒÔUNICODEС¶Ë±àÂë,ÒÔË«0½áÊø) */

/* ʹÓÃÁËÈ«¾Ö»º³åÇøGlobalBufµÄǰ34¸ö×Ö½Ú,sizeof(GlobalBuf)>=sizeof(FAT_DIR_INFO)+2 */

UINT8 CH376CreateLongName( PUINT8 PathName, PUINT8 LongName ); /* н¨¾ßÓг¤ÎļþÃûµÄÎļþ,¹Ø±ÕÎļþºó·µ»Ø,LongNameÊäÈë·¾¶±ØÐëÔÚRAMÖÐ */

/* ÐèÒªÊäÈë¶ÌÎļþÃûµÄÍêÕû·¾¶PathName(ÇëÊÂÏȲο¼FAT¹æ·¶Óɳ¤ÎļþÃû×ÔÐвúÉú),ÐèÒª

ÊäÈëÒÔUNICODEС¶Ë±àÂëµÄÒÔË«0½áÊøµÄ³¤ÎļþÃûLongName */

/* ʹÓÃÁËÈ«¾Ö»º³åÇøGlobalBufµÄǰ64¸ö×Ö½Ú,sizeof(GlobalBuf)>=sizeof(FAT_DIR_INFO)*2 */

#endif

#endif

FILE_SYS.CÎļþ

/* CH376оƬ Îļþϵͳ²ã V1.1 */

/* ÌṩÎļþϵͳ³£ÓÃ×Ó³ÌÐò,ÌṩÃüÁî´ò°ü */

/* ²»Ê¹ÓõÄ×Ó³ÌÐò¿ÉÒÔ×¢Ê͵ô,´Ó¶ø½ÚÔ¼µ¥Æ¬»úµÄ³ÌÐòROM¿Õ¼äºÍÊý¾ÝRAM¿Õ¼ä */

/* ÕâÀïµÄ×Ó³ÌÐòÊÇͨ¹ýÀ¨ºÅÖеıäÁ¿´«µÝ²ÎÊý,Èç¹û²ÎÊý½Ï¶à,ΪÁ˽ÚÔ¼RAM,Ò²¿ÉÒԲο¼CH375×Ó³ÌÐò¿â¸Ä³Éͨ¹ýͬһȫ¾Ö±äÁ¿/ÁªºÏ½á¹¹CH376_CMD_DATA´«µÝ */

/* name ²ÎÊýÊÇÖ¸¶ÌÎļþÃû, ¿ÉÒÔ°üÀ¨¸ùĿ¼·û, µ«²»º¬Óз¾¶·Ö¸ô·û, ×ܳ¤¶È²»³¬¹ý1+8+1+3+1×Ö½Ú */

/* PathName ²ÎÊýÊÇָȫ·¾¶µÄ¶ÌÎļþÃû, °üÀ¨¸ùĿ¼·û¡¢¶à¼¶×ÓĿ¼¼°Â·¾¶·Ö¸ô·û¡¢ÎļþÃû/Ŀ¼Ãû */

/* LongName ²ÎÊýÊÇÖ¸³¤ÎļþÃû, ÒÔUNICODEС¶Ë˳Ðò±àÂë, ÒÔÁ½¸ö0×Ö½Ú½áÊø, ʹÓó¤ÎļþÃû×Ó³ÌÐò±ØÐëÏȶ¨ÒåÈ«¾Ö»º³åÇøGlobalBuf, ³¤¶È²»Ð¡ÓÚ64×Ö½Ú, ¿ÉÒÔÓëÆäËü×Ó³ÌÐò¹²Óà */

/* ¶¨Òå NO_DEFAULT_CH376_INT ÓÃÓÚ½ûֹĬÈϵÄWait376Interrupt×Ó³ÌÐò,½ûÖ¹ºó,Ó¦ÓóÌÐò±ØÐë×ÔÐж¨ÒåÒ»¸öͬÃû×Ó³ÌÐò */

/* ¶¨Òå DEF_INT_TIMEOUT ÓÃÓÚÉèÖÃĬÈϵÄWait376Interrupt×Ó³ÌÐòÖеĵȴýÖжϵij¬Ê±Ê±¼ä/Ñ­»·¼ÆÊýÖµ, 0Ôò²»¼ì²é³¬Ê±¶øÒ»Ö±µÈ´ý */

/* ¶¨Òå EN_DIR_CREATE ÓÃÓÚÌṩн¨¶à¼¶×ÓĿ¼µÄ×Ó³ÌÐò,ĬÈÏÊDz»Ìṩ */

/* ¶¨Òå EN_DISK_QUERY ÓÃÓÚÌṩ´ÅÅÌÈÝÁ¿²éѯºÍÊ£Óà¿Õ¼ä²éѯµÄ×Ó³ÌÐò,ĬÈÏÊDz»Ìṩ */

/* ¶¨Òå EN_SECTOR_ACCESS ÓÃÓÚÌṩÒÔÉÈÇøÎªµ¥Î»¶ÁдÎļþµÄ×Ó³ÌÐò,ĬÈÏÊDz»Ìṩ */ /* ¶¨Òå EN_LONG_NAME ÓÃÓÚÌṩ֧³Ö³¤ÎļþÃûµÄ×Ó³ÌÐò,ĬÈÏÊDz»Ìṩ */

#include \

UINT8 CH376ReadBlock( PUINT8 buf ) /* ´Óµ±Ç°Ö÷»ú¶ËµãµÄ½ÓÊÕ»º³åÇø¶ÁÈ¡Êý¾Ý¿é,·µ»Ø³¤¶È */ { UINT8 s, l; xWriteCH376Cmd( CMD01_RD_USB_DATA0 ); s = l = xReadCH376Data( ); /* ³¤¶È */ if ( l ) { do

}

{ *buf = xReadCH376Data( ); buf ++; }while ( -- l ); }

xEndCH376Cmd( ); return( s );

UINT8 CH376WriteReqBlock( PUINT8 buf ) /* ÏòÄÚ²¿Ö¸¶¨»º³åÇøÐ´ÈëÇëÇóµÄÊý¾Ý¿é,·µ»Ø³¤¶È */ { UINT8 s, l; xWriteCH376Cmd( CMD01_WR_REQ_DATA ); }

s = l = xReadCH376Data( ); /* ³¤¶È */ if ( l ) { do { xWriteCH376Data( *buf ); buf ++; } while ( -- l ); }

xEndCH376Cmd( ); return( s );

void CH376WriteHostBlock( PUINT8 buf, UINT8 len ) /* ÏòUSBÖ÷»ú¶ËµãµÄ·¢ËÍ»º³åÇøÐ´ÈëÊý¾Ý¿é */ { xWriteCH376Cmd( CMD10_WR_HOST_DATA ); xWriteCH376Data( len ); /* ³¤¶È */ if ( len ) { do { xWriteCH376Data( *buf ); buf ++; } while ( -- len ); } xEndCH376Cmd( ); }

void CH376WriteOfsBlock( PUINT8 buf, UINT8 ofs, UINT8 len ) /* ÏòÄÚ²¿»º³åÇøÖ¸¶¨Æ«ÒƵØÖ·Ð´ÈëÊý¾Ý¿é */ { xWriteCH376Cmd( CMD20_WR_OFS_DATA ); xWriteCH376Data( ofs ); /* Æ«ÒÆµØÖ· */

}

xWriteCH376Data( len ); /* ³¤¶È */ if ( len ) { do { xWriteCH376Data( *buf ); buf ++; } while ( -- len ); }

xEndCH376Cmd( );

void CH376SetFileName( PUINT8 name ) /* ÉèÖý«Òª²Ù×÷µÄÎļþµÄÎļþÃû */ { UINT8 c; xWriteCH376Cmd( CMD10_SET_FILE_NAME ); c = *name; xWriteCH376Data( c ); while ( c ) { name ++; c = *name; if ( c == DEF_SEPAR_CHAR1 || c == DEF_SEPAR_CHAR2 )

c = 0; /* Ç¿Ðн«ÎļþÃû½ØÖ¹ */ xWriteCH376Data( c ); } xEndCH376Cmd( ); }

UINT32 CH376Read32bitDat( void ) /* ´ÓCH376оƬ¶ÁÈ¡32λµÄÊý¾Ý²¢½áÊøÃüÁî */ { UINT8 c0, c1, c2, c3; c0 = xReadCH376Data( ); c1 = xReadCH376Data( ); c2 = xReadCH376Data( ); c3 = xReadCH376Data( ); xEndCH376Cmd( ); return( c0 | (UINT16)c1 << 8 | (UINT32)c2 << 16 | (UINT32)c3 << 24 ); }

UINT8 CH376ReadVar8( UINT8 var ) /* ¶ÁCH376оƬÄÚ²¿µÄ8λ±äÁ¿ */ { UINT8 c0; xWriteCH376Cmd( CMD11_READ_VAR8 ); xWriteCH376Data( var );

}

c0 = xReadCH376Data( ); xEndCH376Cmd( ); return( c0 );

void CH376WriteVar8( UINT8 var, UINT8 dat ) /* дCH376оƬÄÚ²¿µÄ8λ±äÁ¿ */ { xWriteCH376Cmd( CMD20_WRITE_VAR8 ); xWriteCH376Data( var ); xWriteCH376Data( dat ); xEndCH376Cmd( ); }

UINT32 CH376ReadVar32( UINT8 var ) /* ¶ÁCH376оƬÄÚ²¿µÄ32λ±äÁ¿ */ { xWriteCH376Cmd( CMD14_READ_VAR32 ); xWriteCH376Data( var ); }

return( CH376Read32bitDat( ) ); /* ´ÓCH376оƬ¶ÁÈ¡32λµÄÊý¾Ý²¢½áÊøÃüÁî */

void CH376WriteVar32( UINT8 var, UINT32 dat ) /* дCH376оƬÄÚ²¿µÄ32λ±äÁ¿ */ { xWriteCH376Cmd( CMD50_WRITE_VAR32 ); xWriteCH376Data( var ); xWriteCH376Data( (UINT8)dat ); xWriteCH376Data( (UINT8)( (UINT16)dat >> 8 ) ); xWriteCH376Data( (UINT8)( dat >> 16 ) ); xWriteCH376Data( (UINT8)( dat >> 24 ) ); xEndCH376Cmd( ); }

void CH376EndDirInfo( void ) /* ÔÚµ÷ÓÃCH376DirInfoRead»ñÈ¡FAT_DIR_INFO½á¹¹Ö®ºóÓ¦¸Ã֪ͨCH376½áÊø */ { CH376WriteVar8( 0x0D, 0x00 ); }

UINT32 CH376GetFileSize( void ) /* ¶ÁÈ¡µ±Ç°Îļþ³¤¶È */ { return( CH376ReadVar32( VAR_FILE_SIZE ) ); }

UINT8 CH376GetDiskStatus( void ) /* »ñÈ¡´ÅÅ̺ÍÎļþϵͳµÄ¹¤×÷״̬ */ {

return( CH376ReadVar8( VAR_DISK_STATUS ) ); }

UINT8 CH376GetIntStatus( void ) /* »ñÈ¡ÖжÏ״̬²¢È¡ÏûÖжÏÇëÇó */ { UINT8 s; xWriteCH376Cmd( CMD01_GET_STATUS ); s = xReadCH376Data( ); xEndCH376Cmd( ); return( s ); }

UINT8 Wait376Interrupt( void ) /* µÈ´ýCH376ÖжÏ(INT#µÍµçƽ)£¬·µ»ØÖжÏ״̬Âë, ³¬Ê±Ôò·µ»ØERR_USB_UNKNOWN */ { UINT32 i; for ( i = 0; i < 5000000; i ++ ) { /* ¼ÆÊý·ÀÖ¹³¬Ê±,ĬÈϵij¬Ê±Ê±¼ä,Ó뵥Ƭ»úÖ÷ƵÓÐ¹Ø */ if ( Query376Interrupt( ) ) return( CH376GetIntStatus( ) ); /* ¼ì²âµ½ÖÐ¶Ï */ /* ÔڵȴýCH376ÖжϵĹý³ÌÖÐ,¿ÉÒÔ×öЩÐèÒª¼°Ê±´¦ÀíµÄÆäËüÊÂÇé */ } }

return( ERR_USB_UNKNOWN ); /* ²»Ó¦¸Ã·¢ÉúµÄÇé¿ö */

UINT8 CH376SendCmdWaitInt( UINT8 mCmd ) /* ·¢³öÃüÁîÂëºó,µÈ´ýÖÐ¶Ï */ { xWriteCH376Cmd( mCmd ); xEndCH376Cmd( ); return( Wait376Interrupt( ) ); }

UINT8 CH376SendCmdDatWaitInt( UINT8 mCmd, UINT8 mDat ) /* ·¢³öÃüÁîÂëºÍÒ»×Ö½ÚÊý¾Ýºó,µÈ´ýÖÐ¶Ï */ { xWriteCH376Cmd( mCmd ); xWriteCH376Data( mDat ); xEndCH376Cmd( ); return( Wait376Interrupt( ) ); }

UINT8 CH376DiskReqSense( void ) /* ¼ì²éUSB´æ´¢Æ÷´íÎó */

{ }

UINT8 s; mDelaymS( 5 );

s = CH376SendCmdWaitInt( CMD0H_DISK_R_SENSE ); mDelaymS( 5 ); return( s );

UINT8 { }

CH376DiskConnect( void ) /* ¼ì²éUÅÌÊÇ·ñÁ¬½Ó,²»Ö§³ÖSD¿¨ */

if( Query376Interrupt( ) ) /*--- ¾ÍÊǼòµ¥µÄ²éѯÖÐ¶Ï¿ÚµÄµçÆ½×´Ì¬ ---*/ CH376GetIntStatus( ); /* ¼ì²âµ½ÖÐ¶Ï */

return( CH376SendCmdWaitInt( CMD0H_DISK_CONNECT ) );

UINT8 CH376DiskMount( void ) /* ³õʼ»¯´ÅÅ̲¢²âÊÔ´ÅÅÌÊÇ·ñ¾ÍÐ÷ */ { return( CH376SendCmdWaitInt( CMD0H_DISK_MOUNT ) ); }

UINT8 CH376FileOpen( PUINT8 name ) /* ÔÚ¸ùĿ¼»òÕßµ±Ç°Ä¿Â¼Ï´ò¿ªÎļþ»òÕßĿ¼(Îļþ¼Ð) */ { }

CH376SetFileName( name ); /* ÉèÖý«Òª²Ù×÷µÄÎļþµÄÎļþÃû */ if ( name[0] == DEF_SEPAR_CHAR1 || name[0] == DEF_SEPAR_CHAR2 ) CH376WriteVar32( VAR_CURRENT_CLUST, 0 );

return( CH376SendCmdWaitInt( CMD0H_FILE_OPEN ) );

UINT8 CH376FileCreate( PUINT8 name ) /* ÔÚ¸ùĿ¼»òÕßµ±Ç°Ä¿Â¼ÏÂн¨Îļþ,Èç¹ûÎļþÒѾ­´æÔÚÄÇôÏÈɾ³ý */ { if ( name ) CH376SetFileName( name ); /* ÉèÖý«Òª²Ù×÷µÄÎļþµÄÎļþÃû */ return( CH376SendCmdWaitInt( CMD0H_FILE_CREATE ) ); }

UINT8 CH376DirCreate( PUINT8 name ) /* ÔÚ¸ùĿ¼ÏÂн¨Ä¿Â¼(Îļþ¼Ð)²¢´ò¿ª,Èç¹ûĿ¼ÒѾ­´æÔÚÄÇôֱ½Ó´ò¿ª */ { CH376SetFileName( name ); /* ÉèÖý«Òª²Ù×÷µÄÎļþµÄÎļþÃû */ if ( name[0] == DEF_SEPAR_CHAR1 || name[0] == DEF_SEPAR_CHAR2 ) CH376WriteVar32( VAR_CURRENT_CLUST, 0 ); return( CH376SendCmdWaitInt( CMD0H_DIR_CREATE ) );

}

UINT8 CH376SeparatePath( PUINT8 path ) /* ´Ó·¾¶ÖзÖÀë³ö×îºóÒ»¼¶ÎļþÃû»òÕßĿ¼(Îļþ¼Ð)Ãû,·µ»Ø×îºóÒ»¼¶ÎļþÃû»òÕßĿ¼ÃûµÄ×Ö½ÚÆ«ÒÆ */ { PUINT8 pName; for ( pName = path; *pName != 0; ++ pName ); /* µ½ÎļþÃû×Ö·û´®½áÊøÎ»Öà */ while ( *pName != DEF_SEPAR_CHAR1 && *pName != DEF_SEPAR_CHAR2 && pName != path ) pName --; /* ËÑË÷µ¹ÊýµÚÒ»¸ö·¾¶·Ö¸ô·û */ if ( pName != path ) pName ++; /* ÕÒµ½ÁË·¾¶·Ö¸ô·û,ÔòÐÞ¸ÄÖ¸ÏòÄ¿±êÎļþµÄ×îºóÒ»¼¶ÎļþÃû,Ìø¹ýÇ°ÃæµÄ¶à¼¶Ä¿Â¼Ãû¼°Â·¾¶·Ö¸ô·û */ return( pName - path ); }

/* ´ò¿ª¶à¼¶Ä¿Â¼ÏµÄÎļþ»òÕßĿ¼µÄÉϼ¶Ä¿Â¼,Ö§³Ö¶à¼¶Ä¿Â¼Â·¾¶,Ö§³Ö·¾¶·Ö¸ô·û,·¾¶³¤¶È²»³¬¹ý255¸ö×Ö·û */

UINT8 CH376FileOpenDir( PUINT8 PathName, UINT8 StopName )

/* StopName Ö¸Ïò×îºóÒ»¼¶ÎļþÃû»òÕßĿ¼Ãû */ { UINT8 i, s; s = 0; i = 1; /* Ìø¹ýÓпÉÄܵĸùĿ¼·û */ while ( 1 ) { while ( PathName[i] != DEF_SEPAR_CHAR1 && PathName[i] != DEF_SEPAR_CHAR2 && PathName[i] != 0 ) ++ i; /* ËÑË÷ÏÂÒ»¸ö·¾¶·Ö¸ô·û»òÕß·¾¶½áÊø·û */ if ( PathName[i] ) i ++; /* ÕÒµ½ÁË·¾¶·Ö¸ô·û,ÐÞ¸ÄÖ¸ÏòÄ¿±êÎļþµÄ×îºóÒ»¼¶ÎļþÃû */ else i = 0; /* ·¾¶½áÊø */ s = CH376FileOpen( &PathName[s] ); /* ´ò¿ªÎļþ»òÕßĿ¼ */ if ( i && i != StopName ) { /* ·¾¶ÉÐδ½áÊø */ if ( s != ERR_OPEN_DIR ) { /* ÒòΪÊÇÖð¼¶´ò¿ª,ÉÐδµ½Â·¾¶½áÊø,ËùÒÔ,Èç¹û²»Êdzɹ¦´ò¿ªÁËĿ¼,ÄÇô˵Ã÷ÓÐÎÊÌâ */ if ( s == USB_INT_SUCCESS ) return( ERR_FOUND_NAME ); /* Öмä·¾¶±ØÐëÊÇĿ¼Ãû,Èç¹ûÊÇÎļþÃûÔò³ö´í */

else if ( s == ERR_MISS_FILE ) return( ERR_MISS_DIR ); /* Öмä·¾¶µÄij¸ö×ÓĿ¼ûÓÐÕÒµ½,¿ÉÄÜÊÇĿ¼Ãû³Æ´íÎó */ else

return( s ); /* ²Ù×÷³ö´í */ } s = i; /* ´ÓÏÂÒ»¼¶Ä¿Â¼¿ªÊ¼¼ÌÐø */ } else

return( s ); /* ·¾¶½áÊø,USB_INT_SUCCESSΪ³É¹¦´ò¿ªÎļþ,ERR_OPEN_DIRΪ³É¹¦´ò¿ªÄ¿Â¼(Îļþ¼Ð),ÆäËüΪ²Ù×÷³ö´í */ } }

UINT8 CH376FileOpenPath( PUINT8 PathName ) /* ´ò¿ª¶à¼¶Ä¿Â¼ÏµÄÎļþ»òÕßĿ¼(Îļþ¼Ð),Ö§³Ö¶à¼¶Ä¿Â¼Â·¾¶,Ö§³Ö·¾¶·Ö¸ô·û,·¾¶³¤¶È²»³¬¹ý255¸ö×Ö·û */ { return( CH376FileOpenDir( PathName, 0xFF ) ); }

UINT8 CH376FileCreatePath( PUINT8 PathName ) /* н¨¶à¼¶Ä¿Â¼ÏµÄÎļþ,Ö§³Ö¶à¼¶Ä¿Â¼Â·¾¶,Ö§³Ö·¾¶·Ö¸ô·û,·¾¶³¤¶È²»³¬¹ý255¸ö×Ö·û */ { UINT8 s; UINT8 Name; Name = CH376SeparatePath( PathName ); /* ´Ó·¾¶ÖзÖÀë³ö×îºóÒ»¼¶ÎļþÃû,·µ»Ø×îºóÒ»¼¶ÎļþÃûµÄÆ«ÒÆ */ if ( Name ) { /* ÊǶ༶Ŀ¼ */ s = CH376FileOpenDir( PathName, Name ); /* ´ò¿ª¶à¼¶Ä¿Â¼ÏµÄ×îºóÒ»¼¶Ä¿Â¼,¼´´ò¿ªÐ½¨ÎļþµÄÉϼ¶Ä¿Â¼ */ if ( s != ERR_OPEN_DIR ) { /* ÒòΪÊÇ´ò¿ªÉϼ¶Ä¿Â¼,ËùÒÔ,Èç¹û²»Êdzɹ¦´ò¿ªÁËĿ¼,ÄÇô˵Ã÷ÓÐÎÊÌâ */ if ( s == USB_INT_SUCCESS ) return( ERR_FOUND_NAME ); /* Öмä·¾¶±ØÐëÊÇĿ¼Ãû,Èç¹ûÊÇÎļþÃûÔò³ö´í */ else if ( s == ERR_MISS_FILE ) return( ERR_MISS_DIR ); /* Öмä·¾¶µÄij¸ö×ÓĿ¼ûÓÐÕÒµ½,¿ÉÄÜÊÇĿ¼Ãû³Æ´íÎó */ else return( s ); /* ²Ù×÷³ö´í */ } } return( CH376FileCreate( &PathName[Name] ) ); /* ÔÚ¸ùĿ¼»òÕßµ±Ç°Ä¿Â¼ÏÂн¨Îļþ */ }

#ifdef EN_DIR_CREATE

UINT8 CH376DirCreatePath( PUINT8 PathName ) /* н¨¶à¼¶Ä¿Â¼ÏµÄĿ¼(Îļþ¼Ð)²¢´ò¿ª,Ö§³Ö¶à¼¶Ä¿Â¼Â·¾¶,Ö§³Ö·¾¶·Ö¸ô·û,·¾¶³¤¶È²»³¬¹ý255¸ö×Ö·û */ { UINT8 s; UINT8 Name; UINT8 ClustBuf[4]; Name = CH376SeparatePath( PathName ); /* ´Ó·¾¶ÖзÖÀë³ö×îºóÒ»¼¶Ä¿Â¼Ãû,·µ»Ø×îºóÒ»¼¶ÎļþÃûµÄÆ«ÒÆ */ if ( Name ) { /* ÊǶ༶Ŀ¼ */ s = CH376FileOpenDir( PathName, Name ); /* ´ò¿ª¶à¼¶Ä¿Â¼ÏµÄ×îºóÒ»¼¶Ä¿Â¼,¼´´ò¿ªÐ½¨Ä¿Â¼µÄÉϼ¶Ä¿Â¼ */ if ( s != ERR_OPEN_DIR ) { /* ÒòΪÊÇ´ò¿ªÉϼ¶Ä¿Â¼,ËùÒÔ,Èç¹û²»Êdzɹ¦´ò¿ªÁËĿ¼,ÄÇô˵Ã÷ÓÐÎÊÌâ */ if ( s == USB_INT_SUCCESS ) return( ERR_FOUND_NAME ); /* Öмä·¾¶±ØÐëÊÇĿ¼Ãû,Èç¹ûÊÇÎļþÃûÔò³ö´í */ else if ( s == ERR_MISS_FILE ) return( ERR_MISS_DIR ); /* Öмä·¾¶µÄij¸ö×ÓĿ¼ûÓÐÕÒµ½,¿ÉÄÜÊÇĿ¼Ãû³Æ´íÎó */ else return( s ); /* ²Ù×÷³ö´í */ } xWriteCH376Cmd( CMD14_READ_VAR32 ); xWriteCH376Data( VAR_START_CLUSTER ); /* Éϼ¶Ä¿Â¼µÄÆðʼ´ØºÅ */ for ( s = 0; s != 4; s ++ ) ClustBuf[ s ] = xReadCH376Data( ); xEndCH376Cmd( );

s = CH376DirCreate( &PathName[Name] ); /* ÔÚµ±Ç°Ä¿Â¼ÏÂн¨Ä¿Â¼ */ if ( s != USB_INT_SUCCESS ) return( s );

s = CH376ByteLocate( sizeof(FAT_DIR_INFO) + STRUCT_OFFSET( FAT_DIR_INFO,

DIR_FstClusHI ) ); /* ÒÆ¶¯ÎļþÖ¸Õë */ if ( s != USB_INT_SUCCESS ) return( s ); s = CH376ByteWrite( &ClustBuf[2], 2, NULL ); /* дÈëÉϼ¶Ä¿Â¼µÄÆðʼ´ØºÅµÄ¸ß16λ */ if ( s != USB_INT_SUCCESS ) return( s ); s = CH376ByteLocate( sizeof(FAT_DIR_INFO) + STRUCT_OFFSET( FAT_DIR_INFO, DIR_FstClusLO ) ); /* ÒÆ¶¯ÎļþÖ¸Õë */ if ( s != USB_INT_SUCCESS ) return( s ); s = CH376ByteWrite( ClustBuf, 2, NULL ); /* дÈëÉϼ¶Ä¿Â¼µÄÆðʼ´ØºÅµÄµÍ16λ */ if ( s != USB_INT_SUCCESS ) return( s ); s = CH376ByteLocate( 0 ); /* ÒÆ¶¯ÎļþÖ¸Õë,»Ö¸´µ½Ä¿Â¼Í·Î»Öà */ if ( s != USB_INT_SUCCESS ) return( s ); } else { /* ²»ÊǶ༶Ŀ¼ */ if ( PathName[0] == DEF_SEPAR_CHAR1 || PathName[0] == DEF_SEPAR_CHAR2 ) return( CH376DirCreate( PathName ) ); /* ÔÚ¸ùĿ¼ÏÂн¨Ä¿Â¼ */ else return( ERR_MISS_DIR ); /* ±ØÐëÌṩÍêÕû·¾¶²ÅÄÜʵÏÖÔÚµ±Ç°Ä¿Â¼ÏÂн¨Ä¿

¼ */ } }

#endif

UINT8 CH376FileErase( PUINT8 PathName ) /* ɾ³ýÎļþ,Èç¹ûÒѾ­´ò¿ªÔòÖ±½Óɾ³ý,·ñÔò¶ÔÓÚÎļþ»áÏÈ´ò¿ªÔÙɾ³ý,Ö§³Ö¶à¼¶Ä¿Â¼Â·¾¶ */ { UINT8 s; if ( PathName ) { /* ÎļþÉÐδ´ò¿ª */ for ( s = 1; PathName[s] != DEF_SEPAR_CHAR1 && PathName[s] != DEF_SEPAR_CHAR2 && PathName[s] != 0; ++ s ); /* ËÑË÷ÏÂÒ»¸ö·¾¶·Ö¸ô·û»òÕß·¾¶½áÊø·û */ if ( PathName[s] ) { /* Óз¾¶·Ö¸ô·û,ÊǶ༶Ŀ¼ÏµÄÎļþ»òÕßĿ¼ */ s = CH376FileOpenPath( PathName ); /* ´ò¿ª¶à¼¶Ä¿Â¼ÏµÄÎļþ»òÕßĿ¼ */ if ( s != USB_INT_SUCCESS && s != ERR_OPEN_DIR ) return( s ); /* ²Ù×÷³ö´í */ } else CH376SetFileName( PathName ); /* ûÓз¾¶·Ö¸ô·û,ÊǸùĿ¼»òÕßµ±Ç°Ä¿Â¼ÏµÄÎļþ»òÕßĿ¼,ÉèÖý«Òª²Ù×÷µÄÎļþµÄÎļþÃû */ } return( CH376SendCmdWaitInt( CMD0H_FILE_ERASE ) ); }

UINT8 CH376FileClose( UINT8 UpdateSz ) /* ¹Ø±Õµ±Ç°ÒѾ­´ò¿ªµÄÎļþ»òÕßĿ¼(Îļþ¼Ð) */ { return( CH376SendCmdDatWaitInt( CMD1H_FILE_CLOSE, UpdateSz ) ); }

UINT8 CH376DirInfoRead( void ) /* ¶ÁÈ¡µ±Ç°ÎļþµÄĿ¼ÐÅÏ¢ */ { return( CH376SendCmdDatWaitInt( CMD1H_DIR_INFO_READ, 0xFF ) ); }

UINT8 CH376DirInfoSave( void ) /* ±£´æÎļþµÄĿ¼ÐÅÏ¢ */ { return( CH376SendCmdWaitInt( CMD0H_DIR_INFO_SAVE ) ); }

UINT8 CH376ByteLocate( UINT32 offset ) /* ÒÔ×Ö½ÚΪµ¥Î»Òƶ¯µ±Ç°ÎļþÖ¸Õë */ { xWriteCH376Cmd( CMD4H_BYTE_LOCATE ); xWriteCH376Data( (UINT8)offset ); xWriteCH376Data( (UINT8)((UINT16)offset>>8) ); xWriteCH376Data( (UINT8)(offset>>16) );

}

xWriteCH376Data( (UINT8)(offset>>24) ); xEndCH376Cmd( );

return( Wait376Interrupt( ) );

UINT8 CH376ByteRead( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ) /* ÒÔ×Ö½ÚΪµ¥Î»´Óµ±Ç°Î»ÖöÁÈ¡Êý¾Ý¿é */ { UINT8 s; xWriteCH376Cmd( CMD2H_BYTE_READ ); xWriteCH376Data( (UINT8)ReqCount ); xWriteCH376Data( (UINT8)(ReqCount>>8) ); xEndCH376Cmd( ); if ( RealCount ) *RealCount = 0; while ( 1 ) { s = Wait376Interrupt( ); if ( s == USB_INT_DISK_READ ) { ³¤¶È */

}

s = CH376ReadBlock( buf ); /* ´Óµ±Ç°Ö÷»ú¶ËµãµÄ½ÓÊÕ»º³åÇø¶ÁÈ¡Êý¾Ý¿é,·µ»ØxWriteCH376Cmd( CMD0H_BYTE_RD_GO ); xEndCH376Cmd( ); buf += s;

if ( RealCount ) *RealCount += s;

/* else if ( s == USB_INT_SUCCESS ) return( s );*/ /* ½áÊø */ else return( s ); /* ´íÎó */ } }

UINT8 CH376ByteWrite( PUINT8 buf, UINT16 ReqCount, PUINT16 RealCount ) /* ÒÔ×Ö½ÚΪµ¥Î»Ïòµ±Ç°Î»ÖÃдÈëÊý¾Ý¿é */ { UINT8 s; xWriteCH376Cmd( CMD2H_BYTE_WRITE ); xWriteCH376Data( (UINT8)ReqCount ); xWriteCH376Data( (UINT8)(ReqCount>>8) ); xEndCH376Cmd( ); if ( RealCount ) *RealCount = 0; while ( 1 ) { s = Wait376Interrupt( ); if ( s == USB_INT_DISK_WRITE ) { s = CH376WriteReqBlock( buf ); /* ÏòÄÚ²¿Ö¸¶¨»º³åÇøÐ´ÈëÇëÇóµÄÊý¾Ý¿é,·µ»Ø