mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-09 13:12:37 -05:00
storage: 64-bit sector offsets
* Create new 'sector_t' type alias:
* uint64_t for all targets with HAVE_LBA48 or HAVE_SDUC
* unsigned long for the everything else
* Alter all storage APIs to use sector_t instead of 'unsigned long'
* Alter Volume/Partition/storage info structures to use sector_t
* Disk cache converted to sector_t
* ATA Core:
* convert to using sector_t for sector addresses and drive sizes
* Always fill out upper 16 bits of LBA48 addresses
* IDENTIFY INFO is fixed at 512 bytes, not SECTOR_SIZE
* USB mass storage:
* convert to using sector_t for sector addesses and drive sizes
* Implement READ_16/WRITE_16 for LBA48 addresses
* Convert FAT code to use sector_t for all sector references
* output_dyn_value() now accepts int64_t instead of 'int'
* Corrected "rockbox info" to work for (MULTIVOLUME & !MULTIDRIVE)
* Better reporting of disk and (logical+physical) sector sizes in debug info
* Detect SDUC cards and report on storage debug_info screen
To-do: SDUC
* Refactor SD core to remove duplicate code in every driver
* Card probe and init state machine
* Implement core SDUC support
* SD2.0 needs to be 2.0+ (fixed for jz47xx and x1000)
* Host and Card ID (ACMD41)
* 32-bit addressing for all read/write/erase operations (CMD22)
* ADD SDUC to target device drivers, defining HAVE_SDUC as appropriate
Change-Id: Ib0138781a0081664d11511037685503df1b93608
This commit is contained in:
parent
9ff308a589
commit
15e5237469
49 changed files with 629 additions and 435 deletions
|
|
@ -84,7 +84,7 @@ struct nand_param
|
|||
*
|
||||
*/
|
||||
|
||||
static volatile unsigned long nand_address;
|
||||
static volatile sector_t nand_address;
|
||||
#define NAND_DATAPORT (nand_address)
|
||||
#define NAND_ADDRPORT (nand_address+0x10000)
|
||||
#define NAND_COMMPORT (nand_address+0x08000)
|
||||
|
|
@ -111,7 +111,7 @@ static volatile unsigned long nand_address;
|
|||
static struct nand_info* chip_info = NULL;
|
||||
static struct nand_info* banks[4];
|
||||
static unsigned int nr_banks = 1;
|
||||
static unsigned long bank_size;
|
||||
static sector_t bank_size;
|
||||
static struct nand_param internal_param;
|
||||
static struct mutex nand_mtx;
|
||||
#ifdef USE_DMA
|
||||
|
|
@ -282,7 +282,7 @@ static void jz_rs_correct(unsigned char *dat, int idx, int mask)
|
|||
/*
|
||||
* Read oob
|
||||
*/
|
||||
static int jz_nand_read_oob(unsigned long page_addr, unsigned char *buf, int size)
|
||||
static int jz_nand_read_oob(sector_t page_addr, unsigned char *buf, int size)
|
||||
{
|
||||
struct nand_param *nandp = &internal_param;
|
||||
int page_size, row_cycle, bus_width;
|
||||
|
|
@ -338,7 +338,7 @@ static int jz_nand_read_oob(unsigned long page_addr, unsigned char *buf, int siz
|
|||
* page - page number within a block: 0, 1, 2, ...
|
||||
* dst - pointer to target buffer
|
||||
*/
|
||||
static int jz_nand_read_page(unsigned long page_addr, unsigned char *dst)
|
||||
static int jz_nand_read_page(sector_t page_addr, unsigned char *dst)
|
||||
{
|
||||
struct nand_param *nandp = &internal_param;
|
||||
int page_size, oob_size;
|
||||
|
|
@ -611,7 +611,7 @@ int nand_init(void)
|
|||
return res;
|
||||
}
|
||||
|
||||
static inline int read_sector(unsigned long start, unsigned int count,
|
||||
static inline int read_sector(sector_t start, unsigned int count,
|
||||
void* buf, unsigned int chip_size)
|
||||
{
|
||||
register int ret;
|
||||
|
|
@ -627,14 +627,14 @@ static inline int read_sector(unsigned long start, unsigned int count,
|
|||
return ret;
|
||||
}
|
||||
|
||||
int nand_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* buf)
|
||||
int nand_read_sectors(IF_MD(int drive,) sector_t start, int count, void* buf)
|
||||
{
|
||||
#ifdef HAVE_MULTIDRIVE
|
||||
(void)drive;
|
||||
#endif
|
||||
int ret = 0;
|
||||
unsigned int i, _count, chip_size = chip_info->page_size;
|
||||
unsigned long _start;
|
||||
sector_t _start;
|
||||
|
||||
logf("start");
|
||||
mutex_lock(&nand_mtx);
|
||||
|
|
@ -670,7 +670,7 @@ int nand_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* bu
|
|||
}
|
||||
|
||||
/* TODO */
|
||||
int nand_write_sectors(IF_MD(int drive,) unsigned long start, int count, const void* buf)
|
||||
int nand_write_sectors(IF_MD(int drive,) sector_t start, int count, const void* buf)
|
||||
{
|
||||
(void)start;
|
||||
(void)count;
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ struct nand_param {
|
|||
|
||||
static struct nand_info* chip_info = NULL;
|
||||
static struct nand_info* bank;
|
||||
static unsigned long nand_size;
|
||||
static sector_t nand_size;
|
||||
static struct nand_param internal_param;
|
||||
static struct mutex nand_mtx;
|
||||
#ifdef USE_DMA
|
||||
|
|
@ -281,7 +281,7 @@ static void jz_rs_correct(unsigned char *dat, int idx, int mask)
|
|||
/*
|
||||
* Read oob
|
||||
*/
|
||||
static int jz_nand_read_oob(unsigned long page_addr, unsigned char *buf, int size)
|
||||
static int jz_nand_read_oob(sector_t page_addr, unsigned char *buf, int size)
|
||||
{
|
||||
struct nand_param *nandp = &internal_param;
|
||||
int page_size, row_cycle, bus_width;
|
||||
|
|
@ -337,7 +337,7 @@ static int jz_nand_read_oob(unsigned long page_addr, unsigned char *buf, int siz
|
|||
* page - page number within a block: 0, 1, 2, ...
|
||||
* dst - pointer to target buffer
|
||||
*/
|
||||
static int jz_nand_read_page(unsigned long page_addr, unsigned char *dst)
|
||||
static int jz_nand_read_page(sector_t page_addr, unsigned char *dst)
|
||||
{
|
||||
struct nand_param *nandp = &internal_param;
|
||||
int page_size, oob_size;
|
||||
|
|
@ -532,7 +532,7 @@ int nand_init(void)
|
|||
return res;
|
||||
}
|
||||
|
||||
static inline int read_sector(unsigned long start, unsigned int count,
|
||||
static inline int read_sector(sector_t start, unsigned int count,
|
||||
void* buf, unsigned int chip_size)
|
||||
{
|
||||
register int ret;
|
||||
|
|
@ -548,7 +548,7 @@ static inline int read_sector(unsigned long start, unsigned int count,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static inline int write_sector(unsigned long start, unsigned int count,
|
||||
static inline int write_sector(sector_t start, unsigned int count,
|
||||
const void* buf, unsigned int chip_size)
|
||||
{
|
||||
int ret = 0;
|
||||
|
|
@ -563,14 +563,14 @@ static inline int write_sector(unsigned long start, unsigned int count,
|
|||
return ret;
|
||||
}
|
||||
|
||||
int nand_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* buf)
|
||||
int nand_read_sectors(IF_MD(int drive,) sector_t start, int count, void* buf)
|
||||
{
|
||||
#ifdef HAVE_MULTIDRIVE
|
||||
(void)drive;
|
||||
#endif
|
||||
int ret = 0;
|
||||
unsigned int _count, chip_size = chip_info->page_size;
|
||||
unsigned long _start;
|
||||
sector_t _start;
|
||||
|
||||
logf("start");
|
||||
mutex_lock(&nand_mtx);
|
||||
|
|
@ -590,14 +590,14 @@ int nand_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* bu
|
|||
return ret;
|
||||
}
|
||||
|
||||
int nand_write_sectors(IF_MD(int drive,) unsigned long start, int count, const void* buf)
|
||||
int nand_write_sectors(IF_MD(int drive,) sector_t start, int count, const void* buf)
|
||||
{
|
||||
#ifdef HAVE_MULTIDRIVE
|
||||
(void)drive;
|
||||
#endif
|
||||
int ret = 0;
|
||||
unsigned int _count, chip_size = chip_info->page_size;
|
||||
unsigned long _start;
|
||||
sector_t _start;
|
||||
|
||||
logf("start");
|
||||
mutex_lock(&nand_mtx);
|
||||
|
|
|
|||
|
|
@ -42,7 +42,6 @@ static struct mutex sd_mtx;
|
|||
|
||||
static int use_4bit;
|
||||
static int num_6;
|
||||
static int sd2_0;
|
||||
|
||||
//#define SD_DMA_ENABLE
|
||||
#define SD_DMA_INTERRUPT 0
|
||||
|
|
@ -598,7 +597,7 @@ static int jz_sd_transmit_data(struct sd_request *req)
|
|||
static inline unsigned int jz_sd_calc_clkrt(unsigned int rate)
|
||||
{
|
||||
unsigned int clkrt;
|
||||
unsigned int clk_src = sd2_0 ? SD_CLOCK_HIGH : SD_CLOCK_FAST;
|
||||
unsigned int clk_src = card.sd2plus ? SD_CLOCK_HIGH : SD_CLOCK_FAST;
|
||||
|
||||
clkrt = 0;
|
||||
while (rate < clk_src)
|
||||
|
|
@ -716,7 +715,7 @@ static int jz_sd_exec_cmd(struct sd_request *request)
|
|||
events = SD_EVENT_RX_DATA_DONE;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
case SD_SWITCH_FUNC:
|
||||
if (num_6 < 2)
|
||||
{
|
||||
#if defined(SD_DMA_ENABLE)
|
||||
|
|
@ -1086,7 +1085,6 @@ static int sd_init_card_state(struct sd_request *request)
|
|||
(request->response[3+i*4]<< 8) | request->response[4+i*4]);
|
||||
|
||||
sd_parse_csd(&card);
|
||||
sd2_0 = (card_extract_bits(card.csd, 127, 2) == 1);
|
||||
|
||||
logf("CSD: %08lx%08lx%08lx%08lx", card.csd[0], card.csd[1], card.csd[2], card.csd[3]);
|
||||
DEBUG("SD card is ready");
|
||||
|
|
@ -1155,7 +1153,7 @@ static int sd_select_card(void)
|
|||
if (retval)
|
||||
return retval;
|
||||
|
||||
if (sd2_0)
|
||||
if (card.sd2plus)
|
||||
{
|
||||
retval = sd_read_switch(&request);
|
||||
if (!retval)
|
||||
|
|
@ -1188,7 +1186,6 @@ static int __sd_init_device(void)
|
|||
/* Initialise card data as blank */
|
||||
memset(&card, 0, sizeof(tCardInfo));
|
||||
|
||||
sd2_0 = 0;
|
||||
num_6 = 0;
|
||||
use_4bit = 0;
|
||||
|
||||
|
|
@ -1250,7 +1247,7 @@ static inline void sd_stop_transfer(void)
|
|||
mutex_unlock(&sd_mtx);
|
||||
}
|
||||
|
||||
int sd_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* buf)
|
||||
int sd_read_sectors(IF_MD(int drive,) sector_t start, int count, void* buf)
|
||||
{
|
||||
#ifdef HAVE_MULTIDRIVE
|
||||
(void)drive;
|
||||
|
|
@ -1276,7 +1273,8 @@ int sd_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* buf)
|
|||
if ((retval = sd_unpack_r1(&request, &r1)))
|
||||
goto err;
|
||||
|
||||
if (sd2_0)
|
||||
// XXX 64-bit
|
||||
if (card.sd2plus)
|
||||
{
|
||||
sd_send_cmd(&request, SD_READ_MULTIPLE_BLOCK, start,
|
||||
count, SD_BLOCK_SIZE, RESPONSE_R1, buf);
|
||||
|
|
@ -1292,19 +1290,18 @@ int sd_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* buf)
|
|||
goto err;
|
||||
}
|
||||
|
||||
last_disk_activity = current_tick;
|
||||
|
||||
sd_simple_cmd(&request, SD_STOP_TRANSMISSION, 0, RESPONSE_R1B);
|
||||
if ((retval = sd_unpack_r1(&request, &r1)))
|
||||
goto err;
|
||||
|
||||
err:
|
||||
last_disk_activity = current_tick;
|
||||
sd_stop_transfer();
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
int sd_write_sectors(IF_MD(int drive,) unsigned long start, int count, const void* buf)
|
||||
int sd_write_sectors(IF_MD(int drive,) sector_t start, int count, const void* buf)
|
||||
{
|
||||
#ifdef HAVE_MULTIDRIVE
|
||||
(void)drive;
|
||||
|
|
@ -1330,7 +1327,8 @@ int sd_write_sectors(IF_MD(int drive,) unsigned long start, int count, const voi
|
|||
if ((retval = sd_unpack_r1(&request, &r1)))
|
||||
goto err;
|
||||
|
||||
if (sd2_0)
|
||||
// XXX 64-bit
|
||||
if (card.sd2plus)
|
||||
{
|
||||
sd_send_cmd(&request, SD_WRITE_MULTIPLE_BLOCK, start,
|
||||
count, SD_BLOCK_SIZE, RESPONSE_R1,
|
||||
|
|
|
|||
|
|
@ -57,8 +57,6 @@ static struct semaphore sd_wakeup[NUM_DRIVES];
|
|||
|
||||
static int use_4bit[NUM_DRIVES];
|
||||
static int num_6[NUM_DRIVES];
|
||||
static int sd2_0[NUM_DRIVES];
|
||||
|
||||
|
||||
//#define DEBUG(x...) logf(x)
|
||||
#define DEBUG(x, ...)
|
||||
|
|
@ -698,7 +696,7 @@ static inline unsigned int jz_sd_calc_clkrt(const int drive, unsigned int rate)
|
|||
unsigned int clkrt = 0;
|
||||
unsigned int clk_src = cpu_frequency / __cpm_get_mscdiv(); /* MSC_CLK */
|
||||
|
||||
if (!sd2_0[drive] && rate > SD_CLOCK_FAST)
|
||||
if (!card[drive].sd2plus && rate > SD_CLOCK_FAST)
|
||||
rate = SD_CLOCK_FAST;
|
||||
|
||||
while (rate < clk_src)
|
||||
|
|
@ -1192,7 +1190,6 @@ static int sd_init_card_state(const int drive, struct sd_request *request)
|
|||
(request->response[3+i*4]<< 8) | request->response[4+i*4]);
|
||||
|
||||
sd_parse_csd(&card[drive]);
|
||||
sd2_0[drive] = (card_extract_bits(card[drive].csd, 127, 2) == 1);
|
||||
|
||||
logf("CSD: %08lx%08lx%08lx%08lx", card[drive].csd[0], card[drive].csd[1], card[drive].csd[2], card[drive].csd[3]);
|
||||
DEBUG("SD card is ready");
|
||||
|
|
@ -1261,7 +1258,7 @@ static int sd_select_card(const int drive)
|
|||
if (retval)
|
||||
return retval;
|
||||
|
||||
if (sd2_0[drive])
|
||||
if (card[drive].sd2plus)
|
||||
{
|
||||
retval = sd_read_switch(drive, &request);
|
||||
if (!retval)
|
||||
|
|
@ -1292,7 +1289,6 @@ static int __sd_init_device(const int drive)
|
|||
/* Initialise card data as blank */
|
||||
memset(&card[drive], 0, sizeof(tCardInfo));
|
||||
|
||||
sd2_0[drive] = 0;
|
||||
num_6[drive] = 0;
|
||||
use_4bit[drive] = 0;
|
||||
active[drive] = 0;
|
||||
|
|
@ -1402,7 +1398,7 @@ static inline void sd_stop_transfer(const int drive)
|
|||
mutex_unlock(&sd_mtx[drive]);
|
||||
}
|
||||
|
||||
int sd_transfer_sectors(IF_MD(const int drive,) unsigned long start, int count, void* buf, bool write)
|
||||
int sd_transfer_sectors(IF_MD(const int drive,) sector_t start, int count, void* buf, bool write)
|
||||
{
|
||||
struct sd_request request;
|
||||
struct sd_response_r1 r1;
|
||||
|
|
@ -1427,11 +1423,12 @@ int sd_transfer_sectors(IF_MD(const int drive,) unsigned long start, int count,
|
|||
if ((retval = sd_unpack_r1(&request, &r1)))
|
||||
goto err;
|
||||
|
||||
// XXX 64-bit
|
||||
sd_send_cmd(drive, &request,
|
||||
(count > 1) ?
|
||||
(write ? SD_WRITE_MULTIPLE_BLOCK : SD_READ_MULTIPLE_BLOCK) :
|
||||
(write ? SD_WRITE_BLOCK : SD_READ_SINGLE_BLOCK),
|
||||
sd2_0[drive] ? start : (start * SD_BLOCK_SIZE),
|
||||
card[drive].sd2plus ? start : (start * SD_BLOCK_SIZE),
|
||||
count, SD_BLOCK_SIZE, RESPONSE_R1, buf);
|
||||
if ((retval = sd_unpack_r1(&request, &r1)))
|
||||
goto err;
|
||||
|
|
@ -1451,12 +1448,12 @@ err:
|
|||
return retval;
|
||||
}
|
||||
|
||||
int sd_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* buf)
|
||||
int sd_read_sectors(IF_MD(int drive,) sector_t start, int count, void* buf)
|
||||
{
|
||||
return sd_transfer_sectors(IF_MD(drive,) start, count, buf, false);
|
||||
}
|
||||
|
||||
int sd_write_sectors(IF_MD(int drive,) unsigned long start, int count, const void* buf)
|
||||
int sd_write_sectors(IF_MD(int drive,) sector_t start, int count, const void* buf)
|
||||
{
|
||||
return sd_transfer_sectors(IF_MD(drive,) start, count, (void*)buf, true);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -844,7 +844,7 @@ int msc_cmd_send_csd(msc_drv* d)
|
|||
d->cardinfo.csd[i] = req.response[i];
|
||||
sd_parse_csd(&d->cardinfo);
|
||||
|
||||
if((req.response[0] >> 30) == 1)
|
||||
if(d->cardinfo.sd2plus)
|
||||
d->driver_flags |= MSC_DF_V2_CARD;
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ static int sd_init_card(msc_drv* d)
|
|||
}
|
||||
|
||||
static int sd_transfer(msc_drv* d, bool write,
|
||||
unsigned long start, int count, void* buf)
|
||||
sector_t start, int count, void* buf)
|
||||
{
|
||||
int status = -1;
|
||||
|
||||
|
|
@ -114,6 +114,7 @@ static int sd_transfer(msc_drv* d, bool write,
|
|||
: SD_READ_MULTIPLE_BLOCK;
|
||||
}
|
||||
|
||||
// XXX 64-bit
|
||||
if(d->driver_flags & MSC_DF_V2_CARD)
|
||||
req.argument = start;
|
||||
else
|
||||
|
|
@ -142,14 +143,14 @@ static int sd_transfer(msc_drv* d, bool write,
|
|||
return status;
|
||||
}
|
||||
|
||||
int sd_read_sectors(IF_MD(int drive,) unsigned long start,
|
||||
int sd_read_sectors(IF_MD(int drive,) sector_t start,
|
||||
int count, void* buf)
|
||||
{
|
||||
return sd_transfer(sd_to_msc[IF_MD_DRV(drive)], false,
|
||||
start, count, buf);
|
||||
}
|
||||
|
||||
int sd_write_sectors(IF_MD(int drive,) unsigned long start,
|
||||
int sd_write_sectors(IF_MD(int drive,) sector_t start,
|
||||
int count, const void* buf)
|
||||
{
|
||||
return sd_transfer(sd_to_msc[IF_MD_DRV(drive)], true,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue