diff options
Diffstat (limited to 'firmware/target/mips/ingenic_jz47xx')
7 files changed, 57 insertions, 62 deletions
diff --git a/firmware/target/mips/ingenic_jz47xx/app.lds b/firmware/target/mips/ingenic_jz47xx/app.lds index 1d300fed82..29a973a0ca 100644 --- a/firmware/target/mips/ingenic_jz47xx/app.lds +++ b/firmware/target/mips/ingenic_jz47xx/app.lds | |||
@@ -37,15 +37,11 @@ SECTIONS | |||
37 | { | 37 | { |
38 | . = DRAMORIG; | 38 | . = DRAMORIG; |
39 | 39 | ||
40 | .startup : | 40 | .text : |
41 | { | 41 | { |
42 | loadaddress = .; | 42 | loadaddress = .; |
43 | _loadaddress = .; | 43 | _loadaddress = .; |
44 | *(.startup.text); | 44 | *(.init.text); |
45 | } > DRAM | ||
46 | |||
47 | .text : | ||
48 | { | ||
49 | *(.text*); | 45 | *(.text*); |
50 | #ifndef HAVE_INIT_ATTR | 46 | #ifndef HAVE_INIT_ATTR |
51 | *(.init*); | 47 | *(.init*); |
diff --git a/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c b/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c index 5f320f8e9b..77fd5c013b 100644 --- a/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c +++ b/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c | |||
@@ -84,7 +84,7 @@ struct nand_param | |||
84 | * | 84 | * |
85 | */ | 85 | */ |
86 | 86 | ||
87 | static volatile unsigned long nand_address; | 87 | static volatile sector_t nand_address; |
88 | #define NAND_DATAPORT (nand_address) | 88 | #define NAND_DATAPORT (nand_address) |
89 | #define NAND_ADDRPORT (nand_address+0x10000) | 89 | #define NAND_ADDRPORT (nand_address+0x10000) |
90 | #define NAND_COMMPORT (nand_address+0x08000) | 90 | #define NAND_COMMPORT (nand_address+0x08000) |
@@ -111,7 +111,7 @@ static volatile unsigned long nand_address; | |||
111 | static struct nand_info* chip_info = NULL; | 111 | static struct nand_info* chip_info = NULL; |
112 | static struct nand_info* banks[4]; | 112 | static struct nand_info* banks[4]; |
113 | static unsigned int nr_banks = 1; | 113 | static unsigned int nr_banks = 1; |
114 | static unsigned long bank_size; | 114 | static sector_t bank_size; |
115 | static struct nand_param internal_param; | 115 | static struct nand_param internal_param; |
116 | static struct mutex nand_mtx; | 116 | static struct mutex nand_mtx; |
117 | #ifdef USE_DMA | 117 | #ifdef USE_DMA |
@@ -282,7 +282,7 @@ static void jz_rs_correct(unsigned char *dat, int idx, int mask) | |||
282 | /* | 282 | /* |
283 | * Read oob | 283 | * Read oob |
284 | */ | 284 | */ |
285 | static int jz_nand_read_oob(unsigned long page_addr, unsigned char *buf, int size) | 285 | static int jz_nand_read_oob(sector_t page_addr, unsigned char *buf, int size) |
286 | { | 286 | { |
287 | struct nand_param *nandp = &internal_param; | 287 | struct nand_param *nandp = &internal_param; |
288 | int page_size, row_cycle, bus_width; | 288 | 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 | |||
338 | * page - page number within a block: 0, 1, 2, ... | 338 | * page - page number within a block: 0, 1, 2, ... |
339 | * dst - pointer to target buffer | 339 | * dst - pointer to target buffer |
340 | */ | 340 | */ |
341 | static int jz_nand_read_page(unsigned long page_addr, unsigned char *dst) | 341 | static int jz_nand_read_page(sector_t page_addr, unsigned char *dst) |
342 | { | 342 | { |
343 | struct nand_param *nandp = &internal_param; | 343 | struct nand_param *nandp = &internal_param; |
344 | int page_size, oob_size; | 344 | int page_size, oob_size; |
@@ -611,7 +611,7 @@ int nand_init(void) | |||
611 | return res; | 611 | return res; |
612 | } | 612 | } |
613 | 613 | ||
614 | static inline int read_sector(unsigned long start, unsigned int count, | 614 | static inline int read_sector(sector_t start, unsigned int count, |
615 | void* buf, unsigned int chip_size) | 615 | void* buf, unsigned int chip_size) |
616 | { | 616 | { |
617 | register int ret; | 617 | register int ret; |
@@ -627,14 +627,14 @@ static inline int read_sector(unsigned long start, unsigned int count, | |||
627 | return ret; | 627 | return ret; |
628 | } | 628 | } |
629 | 629 | ||
630 | int nand_read_sectors(IF_MV(int drive,) unsigned long start, int count, void* buf) | 630 | int nand_read_sectors(IF_MD(int drive,) sector_t start, int count, void* buf) |
631 | { | 631 | { |
632 | #ifdef HAVE_MULTIVOLUME | 632 | #ifdef HAVE_MULTIDRIVE |
633 | (void)drive; | 633 | (void)drive; |
634 | #endif | 634 | #endif |
635 | int ret = 0; | 635 | int ret = 0; |
636 | unsigned int i, _count, chip_size = chip_info->page_size; | 636 | unsigned int i, _count, chip_size = chip_info->page_size; |
637 | unsigned long _start; | 637 | sector_t _start; |
638 | 638 | ||
639 | logf("start"); | 639 | logf("start"); |
640 | mutex_lock(&nand_mtx); | 640 | mutex_lock(&nand_mtx); |
@@ -670,12 +670,12 @@ int nand_read_sectors(IF_MV(int drive,) unsigned long start, int count, void* bu | |||
670 | } | 670 | } |
671 | 671 | ||
672 | /* TODO */ | 672 | /* TODO */ |
673 | int nand_write_sectors(IF_MV(int drive,) unsigned long start, int count, const void* buf) | 673 | int nand_write_sectors(IF_MD(int drive,) sector_t start, int count, const void* buf) |
674 | { | 674 | { |
675 | (void)start; | 675 | (void)start; |
676 | (void)count; | 676 | (void)count; |
677 | (void)buf; | 677 | (void)buf; |
678 | #ifdef HAVE_MULTIVOLUME | 678 | #ifdef HAVE_MULTIDRIVE |
679 | (void)drive; | 679 | (void)drive; |
680 | #endif | 680 | #endif |
681 | 681 | ||
@@ -727,9 +727,9 @@ void nand_sleepnow(void) | |||
727 | } | 727 | } |
728 | 728 | ||
729 | #ifdef STORAGE_GET_INFO | 729 | #ifdef STORAGE_GET_INFO |
730 | void nand_get_info(IF_MV(int drive,) struct storage_info *info) | 730 | void nand_get_info(IF_MD(int drive,) struct storage_info *info) |
731 | { | 731 | { |
732 | #ifdef HAVE_MULTIVOLUME | 732 | #ifdef HAVE_MULTIDRIVE |
733 | (void)drive; | 733 | (void)drive; |
734 | #endif | 734 | #endif |
735 | 735 | ||
diff --git a/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4760.c b/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4760.c index efce5742d0..ff9b7e419e 100644 --- a/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4760.c +++ b/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4760.c | |||
@@ -110,7 +110,7 @@ struct nand_param { | |||
110 | 110 | ||
111 | static struct nand_info* chip_info = NULL; | 111 | static struct nand_info* chip_info = NULL; |
112 | static struct nand_info* bank; | 112 | static struct nand_info* bank; |
113 | static unsigned long nand_size; | 113 | static sector_t nand_size; |
114 | static struct nand_param internal_param; | 114 | static struct nand_param internal_param; |
115 | static struct mutex nand_mtx; | 115 | static struct mutex nand_mtx; |
116 | #ifdef USE_DMA | 116 | #ifdef USE_DMA |
@@ -281,7 +281,7 @@ static void jz_rs_correct(unsigned char *dat, int idx, int mask) | |||
281 | /* | 281 | /* |
282 | * Read oob | 282 | * Read oob |
283 | */ | 283 | */ |
284 | static int jz_nand_read_oob(unsigned long page_addr, unsigned char *buf, int size) | 284 | static int jz_nand_read_oob(sector_t page_addr, unsigned char *buf, int size) |
285 | { | 285 | { |
286 | struct nand_param *nandp = &internal_param; | 286 | struct nand_param *nandp = &internal_param; |
287 | int page_size, row_cycle, bus_width; | 287 | 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 | |||
337 | * page - page number within a block: 0, 1, 2, ... | 337 | * page - page number within a block: 0, 1, 2, ... |
338 | * dst - pointer to target buffer | 338 | * dst - pointer to target buffer |
339 | */ | 339 | */ |
340 | static int jz_nand_read_page(unsigned long page_addr, unsigned char *dst) | 340 | static int jz_nand_read_page(sector_t page_addr, unsigned char *dst) |
341 | { | 341 | { |
342 | struct nand_param *nandp = &internal_param; | 342 | struct nand_param *nandp = &internal_param; |
343 | int page_size, oob_size; | 343 | int page_size, oob_size; |
@@ -532,7 +532,7 @@ int nand_init(void) | |||
532 | return res; | 532 | return res; |
533 | } | 533 | } |
534 | 534 | ||
535 | static inline int read_sector(unsigned long start, unsigned int count, | 535 | static inline int read_sector(sector_t start, unsigned int count, |
536 | void* buf, unsigned int chip_size) | 536 | void* buf, unsigned int chip_size) |
537 | { | 537 | { |
538 | register int ret; | 538 | register int ret; |
@@ -548,7 +548,7 @@ static inline int read_sector(unsigned long start, unsigned int count, | |||
548 | return ret; | 548 | return ret; |
549 | } | 549 | } |
550 | 550 | ||
551 | static inline int write_sector(unsigned long start, unsigned int count, | 551 | static inline int write_sector(sector_t start, unsigned int count, |
552 | const void* buf, unsigned int chip_size) | 552 | const void* buf, unsigned int chip_size) |
553 | { | 553 | { |
554 | int ret = 0; | 554 | int ret = 0; |
@@ -563,14 +563,14 @@ static inline int write_sector(unsigned long start, unsigned int count, | |||
563 | return ret; | 563 | return ret; |
564 | } | 564 | } |
565 | 565 | ||
566 | int nand_read_sectors(IF_MV(int drive,) unsigned long start, int count, void* buf) | 566 | int nand_read_sectors(IF_MD(int drive,) sector_t start, int count, void* buf) |
567 | { | 567 | { |
568 | #ifdef HAVE_MULTIVOLUME | 568 | #ifdef HAVE_MULTIDRIVE |
569 | (void)drive; | 569 | (void)drive; |
570 | #endif | 570 | #endif |
571 | int ret = 0; | 571 | int ret = 0; |
572 | unsigned int _count, chip_size = chip_info->page_size; | 572 | unsigned int _count, chip_size = chip_info->page_size; |
573 | unsigned long _start; | 573 | sector_t _start; |
574 | 574 | ||
575 | logf("start"); | 575 | logf("start"); |
576 | mutex_lock(&nand_mtx); | 576 | mutex_lock(&nand_mtx); |
@@ -590,14 +590,14 @@ int nand_read_sectors(IF_MV(int drive,) unsigned long start, int count, void* bu | |||
590 | return ret; | 590 | return ret; |
591 | } | 591 | } |
592 | 592 | ||
593 | int nand_write_sectors(IF_MV(int drive,) unsigned long start, int count, const void* buf) | 593 | int nand_write_sectors(IF_MD(int drive,) sector_t start, int count, const void* buf) |
594 | { | 594 | { |
595 | #ifdef HAVE_MULTIVOLUME | 595 | #ifdef HAVE_MULTIDRIVE |
596 | (void)drive; | 596 | (void)drive; |
597 | #endif | 597 | #endif |
598 | int ret = 0; | 598 | int ret = 0; |
599 | unsigned int _count, chip_size = chip_info->page_size; | 599 | unsigned int _count, chip_size = chip_info->page_size; |
600 | unsigned long _start; | 600 | sector_t _start; |
601 | 601 | ||
602 | logf("start"); | 602 | logf("start"); |
603 | mutex_lock(&nand_mtx); | 603 | mutex_lock(&nand_mtx); |
@@ -662,9 +662,9 @@ void nand_sleepnow(void) | |||
662 | } | 662 | } |
663 | 663 | ||
664 | #ifdef STORAGE_GET_INFO | 664 | #ifdef STORAGE_GET_INFO |
665 | void nand_get_info(IF_MV(int drive,) struct storage_info *info) | 665 | void nand_get_info(IF_MD(int drive,) struct storage_info *info) |
666 | { | 666 | { |
667 | #ifdef HAVE_MULTIVOLUME | 667 | #ifdef HAVE_MULTIDRIVE |
668 | (void)drive; | 668 | (void)drive; |
669 | #endif | 669 | #endif |
670 | 670 | ||
diff --git a/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c b/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c index 56dd50814a..066be4e987 100644 --- a/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c +++ b/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4740.c | |||
@@ -42,7 +42,6 @@ static struct mutex sd_mtx; | |||
42 | 42 | ||
43 | static int use_4bit; | 43 | static int use_4bit; |
44 | static int num_6; | 44 | static int num_6; |
45 | static int sd2_0; | ||
46 | 45 | ||
47 | //#define SD_DMA_ENABLE | 46 | //#define SD_DMA_ENABLE |
48 | #define SD_DMA_INTERRUPT 0 | 47 | #define SD_DMA_INTERRUPT 0 |
@@ -598,7 +597,7 @@ static int jz_sd_transmit_data(struct sd_request *req) | |||
598 | static inline unsigned int jz_sd_calc_clkrt(unsigned int rate) | 597 | static inline unsigned int jz_sd_calc_clkrt(unsigned int rate) |
599 | { | 598 | { |
600 | unsigned int clkrt; | 599 | unsigned int clkrt; |
601 | unsigned int clk_src = sd2_0 ? SD_CLOCK_HIGH : SD_CLOCK_FAST; | 600 | unsigned int clk_src = card.sd2plus ? SD_CLOCK_HIGH : SD_CLOCK_FAST; |
602 | 601 | ||
603 | clkrt = 0; | 602 | clkrt = 0; |
604 | while (rate < clk_src) | 603 | while (rate < clk_src) |
@@ -716,7 +715,7 @@ static int jz_sd_exec_cmd(struct sd_request *request) | |||
716 | events = SD_EVENT_RX_DATA_DONE; | 715 | events = SD_EVENT_RX_DATA_DONE; |
717 | break; | 716 | break; |
718 | 717 | ||
719 | case 6: | 718 | case SD_SWITCH_FUNC: |
720 | if (num_6 < 2) | 719 | if (num_6 < 2) |
721 | { | 720 | { |
722 | #if defined(SD_DMA_ENABLE) | 721 | #if defined(SD_DMA_ENABLE) |
@@ -1086,7 +1085,6 @@ static int sd_init_card_state(struct sd_request *request) | |||
1086 | (request->response[3+i*4]<< 8) | request->response[4+i*4]); | 1085 | (request->response[3+i*4]<< 8) | request->response[4+i*4]); |
1087 | 1086 | ||
1088 | sd_parse_csd(&card); | 1087 | sd_parse_csd(&card); |
1089 | sd2_0 = (card_extract_bits(card.csd, 127, 2) == 1); | ||
1090 | 1088 | ||
1091 | logf("CSD: %08lx%08lx%08lx%08lx", card.csd[0], card.csd[1], card.csd[2], card.csd[3]); | 1089 | logf("CSD: %08lx%08lx%08lx%08lx", card.csd[0], card.csd[1], card.csd[2], card.csd[3]); |
1092 | DEBUG("SD card is ready"); | 1090 | DEBUG("SD card is ready"); |
@@ -1155,7 +1153,7 @@ static int sd_select_card(void) | |||
1155 | if (retval) | 1153 | if (retval) |
1156 | return retval; | 1154 | return retval; |
1157 | 1155 | ||
1158 | if (sd2_0) | 1156 | if (card.sd2plus) |
1159 | { | 1157 | { |
1160 | retval = sd_read_switch(&request); | 1158 | retval = sd_read_switch(&request); |
1161 | if (!retval) | 1159 | if (!retval) |
@@ -1188,7 +1186,6 @@ static int __sd_init_device(void) | |||
1188 | /* Initialise card data as blank */ | 1186 | /* Initialise card data as blank */ |
1189 | memset(&card, 0, sizeof(tCardInfo)); | 1187 | memset(&card, 0, sizeof(tCardInfo)); |
1190 | 1188 | ||
1191 | sd2_0 = 0; | ||
1192 | num_6 = 0; | 1189 | num_6 = 0; |
1193 | use_4bit = 0; | 1190 | use_4bit = 0; |
1194 | 1191 | ||
@@ -1250,9 +1247,9 @@ static inline void sd_stop_transfer(void) | |||
1250 | mutex_unlock(&sd_mtx); | 1247 | mutex_unlock(&sd_mtx); |
1251 | } | 1248 | } |
1252 | 1249 | ||
1253 | int sd_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* buf) | 1250 | int sd_read_sectors(IF_MD(int drive,) sector_t start, int count, void* buf) |
1254 | { | 1251 | { |
1255 | #ifdef HAVE_MULTIVOLUME | 1252 | #ifdef HAVE_MULTIDRIVE |
1256 | (void)drive; | 1253 | (void)drive; |
1257 | #endif | 1254 | #endif |
1258 | sd_start_transfer(); | 1255 | sd_start_transfer(); |
@@ -1276,7 +1273,8 @@ int sd_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* buf) | |||
1276 | if ((retval = sd_unpack_r1(&request, &r1))) | 1273 | if ((retval = sd_unpack_r1(&request, &r1))) |
1277 | goto err; | 1274 | goto err; |
1278 | 1275 | ||
1279 | if (sd2_0) | 1276 | // XXX 64-bit |
1277 | if (card.sd2plus) | ||
1280 | { | 1278 | { |
1281 | sd_send_cmd(&request, SD_READ_MULTIPLE_BLOCK, start, | 1279 | sd_send_cmd(&request, SD_READ_MULTIPLE_BLOCK, start, |
1282 | count, SD_BLOCK_SIZE, RESPONSE_R1, buf); | 1280 | count, SD_BLOCK_SIZE, RESPONSE_R1, buf); |
@@ -1292,21 +1290,20 @@ int sd_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* buf) | |||
1292 | goto err; | 1290 | goto err; |
1293 | } | 1291 | } |
1294 | 1292 | ||
1295 | last_disk_activity = current_tick; | ||
1296 | |||
1297 | sd_simple_cmd(&request, SD_STOP_TRANSMISSION, 0, RESPONSE_R1B); | 1293 | sd_simple_cmd(&request, SD_STOP_TRANSMISSION, 0, RESPONSE_R1B); |
1298 | if ((retval = sd_unpack_r1(&request, &r1))) | 1294 | if ((retval = sd_unpack_r1(&request, &r1))) |
1299 | goto err; | 1295 | goto err; |
1300 | 1296 | ||
1301 | err: | 1297 | err: |
1298 | last_disk_activity = current_tick; | ||
1302 | sd_stop_transfer(); | 1299 | sd_stop_transfer(); |
1303 | 1300 | ||
1304 | return retval; | 1301 | return retval; |
1305 | } | 1302 | } |
1306 | 1303 | ||
1307 | int sd_write_sectors(IF_MV(int drive,) unsigned long start, int count, const void* buf) | 1304 | int sd_write_sectors(IF_MD(int drive,) sector_t start, int count, const void* buf) |
1308 | { | 1305 | { |
1309 | #ifdef HAVE_MULTIVOLUME | 1306 | #ifdef HAVE_MULTIDRIVE |
1310 | (void)drive; | 1307 | (void)drive; |
1311 | #endif | 1308 | #endif |
1312 | sd_start_transfer(); | 1309 | sd_start_transfer(); |
@@ -1330,7 +1327,8 @@ int sd_write_sectors(IF_MV(int drive,) unsigned long start, int count, const voi | |||
1330 | if ((retval = sd_unpack_r1(&request, &r1))) | 1327 | if ((retval = sd_unpack_r1(&request, &r1))) |
1331 | goto err; | 1328 | goto err; |
1332 | 1329 | ||
1333 | if (sd2_0) | 1330 | // XXX 64-bit |
1331 | if (card.sd2plus) | ||
1334 | { | 1332 | { |
1335 | sd_send_cmd(&request, SD_WRITE_MULTIPLE_BLOCK, start, | 1333 | sd_send_cmd(&request, SD_WRITE_MULTIPLE_BLOCK, start, |
1336 | count, SD_BLOCK_SIZE, RESPONSE_R1, | 1334 | count, SD_BLOCK_SIZE, RESPONSE_R1, |
@@ -1387,7 +1385,7 @@ int sd_soft_reset(void) | |||
1387 | #ifdef HAVE_HOTSWAP | 1385 | #ifdef HAVE_HOTSWAP |
1388 | bool sd_removable(IF_MD_NONVOID(int drive)) | 1386 | bool sd_removable(IF_MD_NONVOID(int drive)) |
1389 | { | 1387 | { |
1390 | #ifdef HAVE_MULTIVOLUME | 1388 | #ifdef HAVE_MULTIDRIVE |
1391 | (void)drive; | 1389 | (void)drive; |
1392 | #endif | 1390 | #endif |
1393 | return true; | 1391 | return true; |
@@ -1415,7 +1413,7 @@ void MMC_CD_IRQ(void) | |||
1415 | } | 1413 | } |
1416 | #endif | 1414 | #endif |
1417 | 1415 | ||
1418 | bool sd_present(IF_MV_NONVOID(int drive)) | 1416 | bool sd_present(IF_MD_NONVOID(int drive)) |
1419 | { | 1417 | { |
1420 | #ifdef HAVE_MULTIDRIVE | 1418 | #ifdef HAVE_MULTIDRIVE |
1421 | (void)drive; | 1419 | (void)drive; |
diff --git a/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4760.c b/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4760.c index 1960fcbd35..3810852686 100644 --- a/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4760.c +++ b/firmware/target/mips/ingenic_jz47xx/ata-sd-jz4760.c | |||
@@ -57,8 +57,6 @@ static struct semaphore sd_wakeup[NUM_DRIVES]; | |||
57 | 57 | ||
58 | static int use_4bit[NUM_DRIVES]; | 58 | static int use_4bit[NUM_DRIVES]; |
59 | static int num_6[NUM_DRIVES]; | 59 | static int num_6[NUM_DRIVES]; |
60 | static int sd2_0[NUM_DRIVES]; | ||
61 | |||
62 | 60 | ||
63 | //#define DEBUG(x...) logf(x) | 61 | //#define DEBUG(x...) logf(x) |
64 | #define DEBUG(x, ...) | 62 | #define DEBUG(x, ...) |
@@ -698,7 +696,7 @@ static inline unsigned int jz_sd_calc_clkrt(const int drive, unsigned int rate) | |||
698 | unsigned int clkrt = 0; | 696 | unsigned int clkrt = 0; |
699 | unsigned int clk_src = cpu_frequency / __cpm_get_mscdiv(); /* MSC_CLK */ | 697 | unsigned int clk_src = cpu_frequency / __cpm_get_mscdiv(); /* MSC_CLK */ |
700 | 698 | ||
701 | if (!sd2_0[drive] && rate > SD_CLOCK_FAST) | 699 | if (!card[drive].sd2plus && rate > SD_CLOCK_FAST) |
702 | rate = SD_CLOCK_FAST; | 700 | rate = SD_CLOCK_FAST; |
703 | 701 | ||
704 | while (rate < clk_src) | 702 | while (rate < clk_src) |
@@ -1192,7 +1190,6 @@ static int sd_init_card_state(const int drive, struct sd_request *request) | |||
1192 | (request->response[3+i*4]<< 8) | request->response[4+i*4]); | 1190 | (request->response[3+i*4]<< 8) | request->response[4+i*4]); |
1193 | 1191 | ||
1194 | sd_parse_csd(&card[drive]); | 1192 | sd_parse_csd(&card[drive]); |
1195 | sd2_0[drive] = (card_extract_bits(card[drive].csd, 127, 2) == 1); | ||
1196 | 1193 | ||
1197 | logf("CSD: %08lx%08lx%08lx%08lx", card[drive].csd[0], card[drive].csd[1], card[drive].csd[2], card[drive].csd[3]); | 1194 | logf("CSD: %08lx%08lx%08lx%08lx", card[drive].csd[0], card[drive].csd[1], card[drive].csd[2], card[drive].csd[3]); |
1198 | DEBUG("SD card is ready"); | 1195 | DEBUG("SD card is ready"); |
@@ -1261,7 +1258,7 @@ static int sd_select_card(const int drive) | |||
1261 | if (retval) | 1258 | if (retval) |
1262 | return retval; | 1259 | return retval; |
1263 | 1260 | ||
1264 | if (sd2_0[drive]) | 1261 | if (card[drive].sd2plus) |
1265 | { | 1262 | { |
1266 | retval = sd_read_switch(drive, &request); | 1263 | retval = sd_read_switch(drive, &request); |
1267 | if (!retval) | 1264 | if (!retval) |
@@ -1292,7 +1289,6 @@ static int __sd_init_device(const int drive) | |||
1292 | /* Initialise card data as blank */ | 1289 | /* Initialise card data as blank */ |
1293 | memset(&card[drive], 0, sizeof(tCardInfo)); | 1290 | memset(&card[drive], 0, sizeof(tCardInfo)); |
1294 | 1291 | ||
1295 | sd2_0[drive] = 0; | ||
1296 | num_6[drive] = 0; | 1292 | num_6[drive] = 0; |
1297 | use_4bit[drive] = 0; | 1293 | use_4bit[drive] = 0; |
1298 | active[drive] = 0; | 1294 | active[drive] = 0; |
@@ -1402,7 +1398,7 @@ static inline void sd_stop_transfer(const int drive) | |||
1402 | mutex_unlock(&sd_mtx[drive]); | 1398 | mutex_unlock(&sd_mtx[drive]); |
1403 | } | 1399 | } |
1404 | 1400 | ||
1405 | int sd_transfer_sectors(IF_MD(const int drive,) unsigned long start, int count, void* buf, bool write) | 1401 | int sd_transfer_sectors(IF_MD(const int drive,) sector_t start, int count, void* buf, bool write) |
1406 | { | 1402 | { |
1407 | struct sd_request request; | 1403 | struct sd_request request; |
1408 | struct sd_response_r1 r1; | 1404 | struct sd_response_r1 r1; |
@@ -1427,11 +1423,12 @@ int sd_transfer_sectors(IF_MD(const int drive,) unsigned long start, int count, | |||
1427 | if ((retval = sd_unpack_r1(&request, &r1))) | 1423 | if ((retval = sd_unpack_r1(&request, &r1))) |
1428 | goto err; | 1424 | goto err; |
1429 | 1425 | ||
1426 | // XXX 64-bit | ||
1430 | sd_send_cmd(drive, &request, | 1427 | sd_send_cmd(drive, &request, |
1431 | (count > 1) ? | 1428 | (count > 1) ? |
1432 | (write ? SD_WRITE_MULTIPLE_BLOCK : SD_READ_MULTIPLE_BLOCK) : | 1429 | (write ? SD_WRITE_MULTIPLE_BLOCK : SD_READ_MULTIPLE_BLOCK) : |
1433 | (write ? SD_WRITE_BLOCK : SD_READ_SINGLE_BLOCK), | 1430 | (write ? SD_WRITE_BLOCK : SD_READ_SINGLE_BLOCK), |
1434 | sd2_0[drive] ? start : (start * SD_BLOCK_SIZE), | 1431 | card[drive].sd2plus ? start : (start * SD_BLOCK_SIZE), |
1435 | count, SD_BLOCK_SIZE, RESPONSE_R1, buf); | 1432 | count, SD_BLOCK_SIZE, RESPONSE_R1, buf); |
1436 | if ((retval = sd_unpack_r1(&request, &r1))) | 1433 | if ((retval = sd_unpack_r1(&request, &r1))) |
1437 | goto err; | 1434 | goto err; |
@@ -1451,12 +1448,12 @@ err: | |||
1451 | return retval; | 1448 | return retval; |
1452 | } | 1449 | } |
1453 | 1450 | ||
1454 | int sd_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* buf) | 1451 | int sd_read_sectors(IF_MD(int drive,) sector_t start, int count, void* buf) |
1455 | { | 1452 | { |
1456 | return sd_transfer_sectors(IF_MD(drive,) start, count, buf, false); | 1453 | return sd_transfer_sectors(IF_MD(drive,) start, count, buf, false); |
1457 | } | 1454 | } |
1458 | 1455 | ||
1459 | int sd_write_sectors(IF_MD(int drive,) unsigned long start, int count, const void* buf) | 1456 | int sd_write_sectors(IF_MD(int drive,) sector_t start, int count, const void* buf) |
1460 | { | 1457 | { |
1461 | return sd_transfer_sectors(IF_MD(drive,) start, count, (void*)buf, true); | 1458 | return sd_transfer_sectors(IF_MD(drive,) start, count, (void*)buf, true); |
1462 | } | 1459 | } |
diff --git a/firmware/target/mips/ingenic_jz47xx/crt0.S b/firmware/target/mips/ingenic_jz47xx/crt0.S index b73a43d8f2..ee203b3b4d 100644 --- a/firmware/target/mips/ingenic_jz47xx/crt0.S +++ b/firmware/target/mips/ingenic_jz47xx/crt0.S | |||
@@ -44,7 +44,7 @@ | |||
44 | .extern main | 44 | .extern main |
45 | .global _start | 45 | .global _start |
46 | 46 | ||
47 | .section .startup.text,"ax",%progbits | 47 | .section .init.text |
48 | .set push | 48 | .set push |
49 | .set mips32 | 49 | .set mips32 |
50 | .set noreorder | 50 | .set noreorder |
diff --git a/firmware/target/mips/ingenic_jz47xx/xduoo_x3/power-xduoo_x3.c b/firmware/target/mips/ingenic_jz47xx/xduoo_x3/power-xduoo_x3.c index 9ae602ba56..c9bcb47fcd 100644 --- a/firmware/target/mips/ingenic_jz47xx/xduoo_x3/power-xduoo_x3.c +++ b/firmware/target/mips/ingenic_jz47xx/xduoo_x3/power-xduoo_x3.c | |||
@@ -23,15 +23,19 @@ | |||
23 | #include "power.h" | 23 | #include "power.h" |
24 | #include "cpu.h" | 24 | #include "cpu.h" |
25 | 25 | ||
26 | #define CHARGE_STAT_GPIO (32*1+6) /* STAT port */ | 26 | #define CHARGE_STAT_GPIO (32*1+6) /* STAT port */ |
27 | #define PIN_USB_DET (32*4+19) /* USB connected */ | ||
27 | 28 | ||
28 | /* Detect which power sources are present. */ | 29 | /* Detect which power sources are present. */ |
29 | unsigned int power_input_status(void) | 30 | unsigned int power_input_status(void) |
30 | { | 31 | { |
32 | int rval = POWER_INPUT_NONE; | ||
33 | if(!__gpio_get_pin(PIN_USB_DET)) | ||
34 | rval |= POWER_INPUT_USB; | ||
31 | if(!__gpio_get_pin(CHARGE_STAT_GPIO)) | 35 | if(!__gpio_get_pin(CHARGE_STAT_GPIO)) |
32 | return POWER_INPUT_USB_CHARGER; | 36 | rval |= POWER_INPUT_USB_CHARGER; |
33 | 37 | ||
34 | return POWER_INPUT_NONE; | 38 | return rval; |
35 | } | 39 | } |
36 | 40 | ||
37 | void power_init(void) | 41 | void power_init(void) |
@@ -42,5 +46,5 @@ void power_init(void) | |||
42 | 46 | ||
43 | bool charging_state(void) | 47 | bool charging_state(void) |
44 | { | 48 | { |
45 | return (power_input_status() == POWER_INPUT_USB_CHARGER); | 49 | return (power_input_status() & POWER_INPUT_USB_CHARGER); |
46 | } | 50 | } |