sd.h 4.5 KB
Newer Older
A
ArcherChang 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
/*****************************************************************************
 *
 *            Copyright Andes Technology Corporation 2007-2008
 *                         All Rights Reserved.
 *
 *  Revision History:
 *
 *    Aug.21.2007     Created.
 ****************************************************************************/

/*****************************************************************************
 *
 * FILE NAME                                         VERSION
 *
 *   sd.h                     
 *
 * DESCRIPTION
 *
 *   SD controller driver interfaces for client applications.
 *   (Nucleus I/O Driver Architecture)
 *
 * DATA STRUCTURES
 *
 *   None
 *
 * DEPENDENCIES
 *
 *   ag101regs.h
 *   ag101defs.h
 *
 ****************************************************************************/
#ifndef __SD_H__
#define __SD_H__

#include <inttypes.h>
/*
 * SDD I/O control code, used for clients not using driver wrapper routines,
 * i.e., when not using middle-ware interfaces.  Driver implementation target
 * is that almost every IOCTL should exist a corresponding wrapper routine.
 */
typedef enum SDD_IOCTL {
	SDD_IOCTL_READ_SECTORS,		/* Parameter: pointer to SDD_IOCTL_READ_SECTORS_PARAM struct */
	SDD_IOCTL_WRITE_SECTORS,	/* Parameter: pointer to SDD_IOCTL_WRITE_SECTORS_PARAM struct */
} SDD_IOCTL;

/* Parameter struct for SDD_IOCTL_ */
typedef struct _SDD_IOCTL_READ_SECTORS_PARAM {

	uint32_t lba_sector;	/* start sector number */
	uint32_t sector_count;	/* number of sectors included in this operation */
	uint32_t sector_size;	/* sector size in bytes */
	void *io_buff;		/* buffer pointer */

} SDD_IOCTL_READ_SECTORS_PARAM;

typedef struct _SDD_IOCTL_WRITE_SECTORS_PARAM {

	uint32_t lba_sector;	/* start sector number */
	uint32_t sector_count;	/* number of sectors included in this operation */
	uint32_t sector_size;	/* sector size in bytes */
	void *io_buff;		/* buffer pointer */

} SDD_IOCTL_WRITE_SECTORS_PARAM;

typedef enum SDD_EVENTS {

	SDD_EVENT_CD = 0x00000001,	/* Card-detection event. Event parameter: SDD_CD_EVENT */

} SDD_EVENTS;

typedef enum SDD_CD_EVENT_PARAM {
	SDD_CD_CARD_INSERTED = 1,
	SDD_CD_CARD_REMOVED = 0,

} SDD_CD_EVENT_PARAM;

typedef enum SDD_DMA_MODE {
	SDD_DMA_NONE = 0,	/* no dma, deivce i/o is through pio */
	SDD_DMA_DCH = 1,	/* dma channel is dynamically allocated on i/o request and get free after dma. */
	SDD_DMA_SCH = 2,	/* dma channel is allocated and occupied during device initialization. */

} SDD_DMA_MODE;

/* Define data structures for management of CF device. */
typedef struct SDD_DEVICE_STRUCT {

	void *bdev_id;		/* (reserved) The block device context. This field is reserved by the driver. */
	uint8_t dma;		/* (in)  one of the enum value in SDD_DMA_MODE. */
	uint8_t func;		/* (in)  (Reserved currently) Preferred SD card function mode (SD Memory, SD/IO, SPI) */
	uint8_t padding[2];	/* stuff bytes */

} SDD_DEVICE;

/*****************************************************************************
 * Note: Everything below is designed as an interface wrapper to access 
 *       SD driver.
 *
 * [Structures]
 *
 * [Functions]
 *
 *
 ****************************************************************************/

/* driver generic error code for SDC */
#define SDD_SUCCESS              0x00
#define SDD_INVALID_INIT         0x01
#define SDD_INVALID_REQUEST      0x02
#define SDD_NOT_SUPPORTED        0x03

#define SDD_INVALID_FUNCTION     0x11
#define SDD_INVALID_PARAMETER    0x12
#define SDD_CARD_REMOVED         0x13
#define SDD_INVALID_MEDIA        0x14
#define SDD_INVALID_IOCTL        0x15
#define SDD_WRITE_DATA_ERROR     0x16
#define SDD_READ_DATA_ERROR      0x17
#define SDD_INVLAID_ADDRESS      0x18
#define SDD_INVLAID_ADDR_RANGE   0x19

#define SDD_CMD_TIMEOUT          0x21
#define SDD_CMD_ERROR            0x22
#define SDD_RSP_TIMEOUT          0x23
#define SDD_RSP_CRC_ERROR        0x24
#define SDD_NOT_SUPPORT_ACMD     0x25
#define SDD_CSR_ERROR            0x26
#define SDD_INVALID_STATE        0x27
#define SDD_WAIT_TIMEOUT         0x28
#define SDD_WRITE_PROTECTED      0x29
#define SDD_CARD_LOCKED          0x30

extern void _sdd_lisr(int vector);
extern void _sdd_hisr(void *param);
extern uint32_t NDS_SD_Init(SDD_DEVICE * sdd_dev);
extern void NDS_SD_Unload(void);
extern uint32_t NDS_SD_ReadSectors(SDD_DEVICE * sdd_dev, uint32_t sector,
				   uint32_t sector_count, uint32_t sector_size,
				   void *buffer);
extern uint32_t NDS_SD_WriteSectors(SDD_DEVICE * sdd_dev, uint32_t sector,
				    uint32_t sector_count, uint32_t sector_size,
				    void *buffer);

#endif /* __SD_H__ */