| usbboot/src/cmd.c |
| 72 | 72 | fd = open(file_path, O_RDONLY); |
| 73 | 73 | |
| 74 | 74 | if (fd < 0) { |
| 75 | | fprintf(stderr, "Error - can't open file '%s': %s\n", |
| 75 | fprintf(stderr, "Error - can't open file '%s': %s\n", |
| 76 | 76 | file_path, strerror(errno)); |
| 77 | 77 | goto out; |
| 78 | 78 | } |
| ... | ... | |
| 80 | 80 | status = read(fd, ingenic_dev->file_buff, ingenic_dev->file_len); |
| 81 | 81 | |
| 82 | 82 | if (status < ingenic_dev->file_len) { |
| 83 | | fprintf(stderr, "Error - can't read file '%s': %s\n", |
| 83 | fprintf(stderr, "Error - can't read file '%s': %s\n", |
| 84 | 84 | file_path, strerror(errno)); |
| 85 | 85 | goto close; |
| 86 | 86 | } |
| 87 | 87 | |
| 88 | 88 | /* write args to code */ |
| 89 | | memcpy(ingenic_dev->file_buff + 8, &hand.fw_args, |
| 89 | memcpy(ingenic_dev->file_buff + 8, &hand.fw_args, |
| 90 | 90 | sizeof(struct fw_args)); |
| 91 | 91 | |
| 92 | 92 | res = 1; |
| ... | ... | |
| 97 | 97 | return res; |
| 98 | 98 | } |
| 99 | 99 | |
| 100 | | /* after upload stage2. must init device */ |
| 101 | | void init_cfg() |
| 100 | int get_ingenic_cpu() |
| 102 | 101 | { |
| 103 | | if (usb_get_ingenic_cpu(&ingenic_dev) < 3) { |
| 104 | | printf(" XBurst CPU not booted yet, boot it first!\n"); |
| 105 | | return; |
| 106 | | } |
| 107 | | |
| 108 | | ingenic_dev.file_buff = &hand; |
| 109 | | ingenic_dev.file_len = sizeof(hand); |
| 110 | | if (usb_send_data_to_ingenic(&ingenic_dev) != 1) |
| 111 | | goto xout; |
| 112 | | |
| 113 | | sleep(1); |
| 114 | | if (usb_ingenic_configration(&ingenic_dev, DS_hand) != 1) |
| 115 | | goto xout; |
| 116 | | |
| 117 | | if (usb_read_data_from_ingenic(&ingenic_dev, ret, 8) != 1) |
| 118 | | goto xout; |
| 119 | | |
| 120 | | printf(" Configuring XBurst CPU succeeded.\n"); |
| 121 | | return; |
| 122 | | xout: |
| 123 | | printf(" Configuring XBurst CPU failed.\n"); |
| 124 | | } |
| 125 | | |
| 126 | | int boot(char *stage1_path, char *stage2_path){ |
| 127 | 102 | int status; |
| 128 | 103 | |
| 129 | 104 | status = usb_get_ingenic_cpu(&ingenic_dev); |
| 105 | |
| 130 | 106 | switch (status) { |
| 131 | 107 | case JZ4740V1: |
| 132 | | status = 0; |
| 133 | 108 | hand.fw_args.cpu_id = 0x4740; |
| 134 | 109 | break; |
| 135 | 110 | case JZ4750V1: |
| 136 | | status = 0; |
| 137 | 111 | hand.fw_args.cpu_id = 0x4750; |
| 138 | 112 | break; |
| 139 | 113 | case JZ4760V1: |
| 140 | | status = 0; |
| 141 | 114 | hand.fw_args.cpu_id = 0x4760; |
| 142 | 115 | break; |
| 143 | 116 | case BOOT4740: |
| 144 | | status = 1; |
| 145 | 117 | hand.fw_args.cpu_id = 0x4740; |
| 146 | 118 | break; |
| 147 | 119 | case BOOT4750: |
| 148 | | status = 1; |
| 149 | 120 | hand.fw_args.cpu_id = 0x4750; |
| 150 | 121 | break; |
| 151 | 122 | case BOOT4760: |
| 152 | | status = 1; |
| 153 | 123 | hand.fw_args.cpu_id = 0x4760; |
| 154 | 124 | break; |
| 155 | 125 | default: |
| 156 | | return 1; |
| 126 | hand.fw_args.cpu_id = 0; |
| 157 | 127 | } |
| 158 | 128 | |
| 159 | | if (status) { |
| 129 | return status; |
| 130 | } |
| 131 | |
| 132 | /* after upload stage2. must init device */ |
| 133 | void init_cfg() |
| 134 | { |
| 135 | int cpu = get_ingenic_cpu(); |
| 136 | if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) { |
| 137 | printf(" Device unboot! Boot it first!\n"); |
| 138 | return; |
| 139 | } |
| 140 | |
| 141 | ingenic_dev.file_buff = &hand; |
| 142 | ingenic_dev.file_len = sizeof(hand); |
| 143 | if (usb_send_data_to_ingenic(&ingenic_dev) != 1) |
| 144 | goto xout; |
| 145 | |
| 146 | sleep(1); |
| 147 | if (usb_ingenic_configration(&ingenic_dev, DS_hand) != 1) |
| 148 | goto xout; |
| 149 | |
| 150 | if (usb_read_data_from_ingenic(&ingenic_dev, ret, 8) != 1) |
| 151 | goto xout; |
| 152 | |
| 153 | printf(" Configuring XBurst CPU succeeded.\n"); |
| 154 | return; |
| 155 | xout: |
| 156 | printf(" Configuring XBurst CPU failed.\n"); |
| 157 | } |
| 158 | |
| 159 | int boot(char *stage1_path, char *stage2_path){ |
| 160 | int status = get_ingenic_cpu(); |
| 161 | |
| 162 | if (status == BOOT4740 || status == BOOT4750 || status == BOOT4760) { |
| 160 | 163 | printf(" Already booted.\n"); |
| 161 | 164 | return 1; |
| 162 | 165 | } else { |
| ... | ... | |
| 181 | 184 | |
| 182 | 185 | printf(" Booted successfully!\n"); |
| 183 | 186 | } |
| 187 | |
| 184 | 188 | usleep(100); |
| 185 | 189 | init_cfg(); |
| 190 | |
| 186 | 191 | return 1; |
| 187 | 192 | } |
| 188 | 193 | |
| ... | ... | |
| 214 | 219 | |
| 215 | 220 | int nand_markbad(struct nand_in *nand_in) |
| 216 | 221 | { |
| 217 | | if (usb_get_ingenic_cpu(&ingenic_dev) < 3) { |
| 222 | int cpu = get_ingenic_cpu(); |
| 223 | if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) { |
| 218 | 224 | printf(" Device unboot! Boot it first!\n"); |
| 219 | 225 | return -1; |
| 220 | 226 | } |
| ... | ... | |
| 222 | 228 | usb_send_data_address_to_ingenic(&ingenic_dev, nand_in->start); |
| 223 | 229 | usb_ingenic_nand_ops(&ingenic_dev, NAND_MARK_BAD); |
| 224 | 230 | usb_read_data_from_ingenic(&ingenic_dev, ret, 8); |
| 225 | | printf(" Mark bad block at %d\n",((ret[3] << 24) | |
| 226 | | (ret[2] << 16) | |
| 227 | | (ret[1] << 8) | |
| 231 | printf(" Mark bad block at %d\n",((ret[3] << 24) | |
| 232 | (ret[2] << 16) | |
| 233 | (ret[1] << 8) | |
| 228 | 234 | (ret[0] << 0)) / hand.nand_ppb); |
| 229 | 235 | return 0; |
| 230 | 236 | } |
| ... | ... | |
| 242 | 248 | goto err; |
| 243 | 249 | } |
| 244 | 250 | |
| 245 | | int cpu = usb_get_ingenic_cpu(&ingenic_dev); |
| 251 | int cpu = get_ingenic_cpu(); |
| 246 | 252 | if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) { |
| 247 | 253 | printf(" Device unboot! Boot it first!\n"); |
| 248 | 254 | goto err; |
| ... | ... | |
| 252 | 258 | ingenic_dev.file_len = nand_in->length; |
| 253 | 259 | usb_send_data_to_ingenic(&ingenic_dev); |
| 254 | 260 | for (i = 0; i < nand_in->max_chip; i++) { |
| 255 | | if ((nand_in->cs_map)[i] == 0) |
| 261 | if ((nand_in->cs_map)[i] == 0) |
| 256 | 262 | continue; |
| 257 | 263 | if (nand_in->option == NO_OOB) { |
| 258 | 264 | page_num = nand_in->length / hand.nand_ps; |
| 259 | | if ((nand_in->length % hand.nand_ps) !=0) |
| 265 | if ((nand_in->length % hand.nand_ps) !=0) |
| 260 | 266 | page_num++; |
| 261 | 267 | } else { |
| 262 | | page_num = nand_in->length / |
| 268 | page_num = nand_in->length / |
| 263 | 269 | (hand.nand_ps + hand.nand_os); |
| 264 | 270 | if ((nand_in->length% (hand.nand_ps + hand.nand_os)) !=0) |
| 265 | 271 | page_num++; |
| 266 | 272 | } |
| 267 | | temp = ((nand_in->option << 12) & 0xf000) + |
| 268 | | ((i<<4) & 0xff0) + NAND_PROGRAM; |
| 273 | temp = ((nand_in->option << 12) & 0xf000) + |
| 274 | ((i<<4) & 0xff0) + NAND_PROGRAM; |
| 269 | 275 | if (usb_send_data_address_to_ingenic(&ingenic_dev, nand_in->start) != 1) |
| 270 | 276 | goto err; |
| 271 | 277 | if (usb_send_data_length_to_ingenic(&ingenic_dev, page_num) != 1) |
| ... | ... | |
| 275 | 281 | if (usb_read_data_from_ingenic(&ingenic_dev, ret, 8) != 1) |
| 276 | 282 | goto err; |
| 277 | 283 | |
| 278 | | printf(" Finish! (len %d start_page %d page_num %d)\n", |
| 284 | printf(" Finish! (len %d start_page %d page_num %d)\n", |
| 279 | 285 | nand_in->length, nand_in->start, page_num); |
| 280 | 286 | |
| 281 | 287 | /* Read back to check! */ |
| ... | ... | |
| 289 | 295 | start_addr = page_num * (hand.nand_ps + hand.nand_os); |
| 290 | 296 | break; |
| 291 | 297 | case OOB_NO_ECC: /* do not support data verify */ |
| 292 | | temp = ((OOB_NO_ECC << 12) & 0xf000) + |
| 298 | temp = ((OOB_NO_ECC << 12) & 0xf000) + |
| 293 | 299 | ((i << 4) & 0xff0) + NAND_READ; |
| 294 | 300 | start_addr = page_num * (hand.nand_ps + hand.nand_os); |
| 295 | 301 | break; |
| 296 | 302 | case NO_OOB: |
| 297 | | temp = ((NO_OOB << 12) & 0xf000) + |
| 303 | temp = ((NO_OOB << 12) & 0xf000) + |
| 298 | 304 | ((i << 4) & 0xff0) + NAND_READ; |
| 299 | 305 | start_addr = page_num * hand.nand_ps; |
| 300 | 306 | break; |
| ... | ... | |
| 307 | 313 | usb_read_data_from_ingenic(&ingenic_dev, check_buf, start_addr); |
| 308 | 314 | usb_read_data_from_ingenic(&ingenic_dev, ret, 8); |
| 309 | 315 | |
| 310 | | cur_page = (ret[3] << 24) | (ret[2] << 16) | (ret[1] << 8) | |
| 316 | cur_page = (ret[3] << 24) | (ret[2] << 16) | (ret[1] << 8) | |
| 311 | 317 | (ret[0] << 0); |
| 312 | 318 | |
| 313 | 319 | if (nand_in->start == 0 && hand.nand_ps == 4096 && |
| ... | ... | |
| 353 | 359 | return -1; |
| 354 | 360 | } |
| 355 | 361 | |
| 356 | | if (usb_get_ingenic_cpu(&ingenic_dev) < 3) { |
| 362 | int cpu = get_ingenic_cpu(); |
| 363 | if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) { |
| 357 | 364 | printf(" Device unboot! Boot it first!\n"); |
| 358 | 365 | return -1; |
| 359 | 366 | } |
| 360 | 367 | |
| 361 | 368 | for (i = 0; i < nand_in->max_chip; i++) { |
| 362 | | if ((nand_in->cs_map)[i]==0) |
| 369 | if ((nand_in->cs_map)[i]==0) |
| 363 | 370 | continue; |
| 364 | 371 | printf(" Erasing No.%d device No.%d flash (start_blk %u blk_num %u)......\n", |
| 365 | 372 | nand_in->dev, i, start_blk, blk_num); |
| ... | ... | |
| 375 | 382 | } |
| 376 | 383 | end_block = ((ret[3] << 24) | |
| 377 | 384 | (ret[2] << 16) | |
| 378 | | (ret[1] << 8) | |
| 385 | (ret[1] << 8) | |
| 379 | 386 | (ret[0] << 0)) / hand.nand_ppb; |
| 380 | | printf(" Return: %02x %02x %02x %02x %02x %02x %02x %02x (position %d)\n", |
| 387 | printf(" Return: %02x %02x %02x %02x %02x %02x %02x %02x (position %d)\n", |
| 381 | 388 | ret[0], ret[1], ret[2], ret[3], ret[4], ret[5], ret[6], ret[7], end_block); |
| 382 | | if (!hand.nand_force_erase) { |
| 389 | if (!hand.nand_force_erase) { |
| 383 | 390 | /* not force erase, show bad block infomation */ |
| 384 | | printf(" There are marked bad blocks: %d\n", |
| 391 | printf(" There are marked bad blocks: %d\n", |
| 385 | 392 | end_block - start_blk - blk_num ); |
| 386 | 393 | } else { |
| 387 | 394 | /* force erase, no bad block infomation can show */ |
| ... | ... | |
| 411 | 418 | |
| 412 | 419 | fd = open(fname, O_RDONLY); |
| 413 | 420 | if (fd < 0) { |
| 414 | | fprintf(stderr, "Error - can't open file '%s': %s\n", |
| 421 | fprintf(stderr, "Error - can't open file '%s': %s\n", |
| 415 | 422 | fname, strerror(errno)); |
| 416 | 423 | return -1; |
| 417 | 424 | } |
| 418 | 425 | |
| 419 | 426 | printf(" Programing No.%d device, flen %d, start page %d...\n",nand_in->dev, flen, nand_in->start); |
| 420 | | n_in.start = nand_in->start / hand.nand_ppb; |
| 427 | n_in.start = nand_in->start / hand.nand_ppb; |
| 421 | 428 | if (nand_in->option == NO_OOB) { |
| 422 | | if (flen % (hand.nand_ppb * hand.nand_ps) == 0) |
| 429 | if (flen % (hand.nand_ppb * hand.nand_ps) == 0) |
| 423 | 430 | n_in.length = flen / (hand.nand_ps * hand.nand_ppb); |
| 424 | 431 | else |
| 425 | 432 | n_in.length = flen / (hand.nand_ps * hand.nand_ppb) + 1; |
| 426 | 433 | } else { |
| 427 | | if (flen % (hand.nand_ppb * (hand.nand_ps + hand.nand_os)) == 0) |
| 428 | | n_in.length = flen / |
| 434 | if (flen % (hand.nand_ppb * (hand.nand_ps + hand.nand_os)) == 0) |
| 435 | n_in.length = flen / |
| 429 | 436 | ((hand.nand_ps + hand.nand_os) * hand.nand_ppb); |
| 430 | 437 | else |
| 431 | | n_in.length = flen / |
| 438 | n_in.length = flen / |
| 432 | 439 | ((hand.nand_ps + hand.nand_os) * hand.nand_ppb) |
| 433 | 440 | + 1; |
| 434 | 441 | } |
| ... | ... | |
| 449 | 456 | printf(" It will cause %d times buffer transfer.\n", j == 0 ? m : m + 1); |
| 450 | 457 | fflush(NULL); |
| 451 | 458 | |
| 452 | | offset = 0; |
| 459 | offset = 0; |
| 453 | 460 | for (k = 0; k < m; k++) { |
| 454 | 461 | if (nand_in->option == NO_OOB) |
| 455 | 462 | page_num = transfer_size / hand.nand_ps; |
| ... | ... | |
| 459 | 466 | code_len = transfer_size; |
| 460 | 467 | status = read(fd, code_buf, code_len); |
| 461 | 468 | if (status < code_len) { |
| 462 | | fprintf(stderr, "Error - can't read file '%s': %s\n", |
| 469 | fprintf(stderr, "Error - can't read file '%s': %s\n", |
| 463 | 470 | fname, strerror(errno)); |
| 464 | 471 | return -1; |
| 465 | 472 | } |
| ... | ... | |
| 485 | 492 | status = read(fd, code_buf, code_len); |
| 486 | 493 | |
| 487 | 494 | if (status < code_len) { |
| 488 | | fprintf(stderr, "Error - can't read file '%s': %s\n", |
| 495 | fprintf(stderr, "Error - can't read file '%s': %s\n", |
| 489 | 496 | fname, strerror(errno)); |
| 490 | 497 | return -1; |
| 491 | 498 | } |
| ... | ... | |
| 499 | 506 | printf(" Info - skip bad block!"); |
| 500 | 507 | |
| 501 | 508 | } |
| 502 | | |
| 509 | |
| 503 | 510 | close(fd); |
| 504 | 511 | return 1; |
| 505 | 512 | } |
| ... | ... | |
| 548 | 555 | nand_in.dev = atoi(com_argv[3]); |
| 549 | 556 | |
| 550 | 557 | (nand_in.cs_map)[atoi(com_argv[4])] = 1; |
| 551 | | if (!strcmp(com_argv[5], "-e")) |
| 558 | if (!strcmp(com_argv[5], "-e")) |
| 552 | 559 | nand_in.option = OOB_ECC; |
| 553 | | else if (!strcmp(com_argv[5], "-o")) |
| 560 | else if (!strcmp(com_argv[5], "-o")) |
| 554 | 561 | nand_in.option = OOB_NO_ECC; |
| 555 | | else if (!strcmp(com_argv[5], "-n")) |
| 562 | else if (!strcmp(com_argv[5], "-n")) |
| 556 | 563 | nand_in.option = NO_OOB; |
| 557 | 564 | else |
| 558 | 565 | printf("%s", help); |
| ... | ... | |
| 575 | 582 | if (com_argc < 3) { |
| 576 | 583 | printf(" Usage: nquery (1) (2)\n" |
| 577 | 584 | " (1):device index number\n" |
| 578 | | " (2):flash index number\n"); |
| 585 | " (2):flash index number\n"); |
| 579 | 586 | return -1; |
| 580 | 587 | } |
| 581 | 588 | init_nand_in(); |
| ... | ... | |
| 584 | 591 | (nand_in.cs_map)[atoi(com_argv[2])] = 1; |
| 585 | 592 | |
| 586 | 593 | for (i = 0; i < nand_in.max_chip; i++) { |
| 587 | | if ((nand_in.cs_map)[i] != 0) |
| 594 | if ((nand_in.cs_map)[i] != 0) |
| 588 | 595 | break; |
| 589 | 596 | } |
| 590 | | if (i >= nand_in.max_chip) |
| 597 | if (i >= nand_in.max_chip) |
| 591 | 598 | return -1; |
| 592 | 599 | |
| 593 | | if (usb_get_ingenic_cpu(&ingenic_dev) < 3) { |
| 600 | int cpu = get_ingenic_cpu(); |
| 601 | if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) { |
| 594 | 602 | printf(" Device unboot! Boot it first!\n"); |
| 595 | 603 | return -1; |
| 596 | 604 | } |
| ... | ... | |
| 651 | 659 | printf(" Page number overflow!\n"); |
| 652 | 660 | return -1; |
| 653 | 661 | } |
| 654 | | if (usb_get_ingenic_cpu(&ingenic_dev) < 3) { |
| 662 | int cpu = get_ingenic_cpu(); |
| 663 | if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) { |
| 655 | 664 | printf(" Device unboot! Boot it first!\n"); |
| 656 | 665 | return -1; |
| 657 | 666 | } |
| 658 | | for (i = 0; i < nand_in.max_chip; i++) |
| 659 | | if ((nand_in.cs_map)[i] != 0) |
| 667 | for (i = 0; i < nand_in.max_chip; i++) |
| 668 | if ((nand_in.cs_map)[i] != 0) |
| 660 | 669 | break; |
| 661 | 670 | if (i >= nand_in.max_chip) return 1; |
| 662 | 671 | csn = i; |
| ... | ... | |
| 672 | 681 | temp = ((csn<<4) & 0xff0) + NAND_READ_OOB; |
| 673 | 682 | break; |
| 674 | 683 | case NAND_READ_RAW: |
| 675 | | temp = ((NO_OOB<<12) & 0xf000) + ((csn<<4) & 0xff0) + |
| 684 | temp = ((NO_OOB<<12) & 0xf000) + ((csn<<4) & 0xff0) + |
| 676 | 685 | NAND_READ_RAW; |
| 677 | 686 | break; |
| 678 | 687 | case NAND_READ_TO_RAM: |
| 679 | | temp = ((NO_OOB<<12) & 0xf000) + ((csn<<4) & 0xff0) + |
| 688 | temp = ((NO_OOB<<12) & 0xf000) + ((csn<<4) & 0xff0) + |
| 680 | 689 | NAND_READ_TO_RAM; |
| 681 | 690 | printf(" Reading nand to RAM: 0x%x\n", ram_addr); |
| 682 | 691 | usb_ingenic_start(&ingenic_dev, VR_PROGRAM_START1, ram_addr); |
| ... | ... | |
| 711 | 720 | { |
| 712 | 721 | unsigned int buffer[8],tmp; |
| 713 | 722 | |
| 714 | | tmp = usb_get_ingenic_cpu(&ingenic_dev); |
| 715 | | if (tmp > 2) { |
| 723 | tmp = get_ingenic_cpu(); |
| 724 | if (tmp == BOOT4740 || tmp == BOOT4750 || tmp == BOOT4760) { |
| 716 | 725 | printf(" This command only run under UNBOOT state!\n"); |
| 717 | 726 | return -1; |
| 718 | 727 | } |
| ... | ... | |
| 759 | 768 | { |
| 760 | 769 | unsigned int tmp; |
| 761 | 770 | |
| 762 | | tmp = usb_get_ingenic_cpu(&ingenic_dev); |
| 763 | | if (tmp > 2) { |
| 771 | tmp = get_ingenic_cpu(); |
| 772 | if (tmp == BOOT4740 || tmp == BOOT4750 || tmp == BOOT4760) { |
| 764 | 773 | printf(" This command only run under UNBOOT state!\n"); |
| 765 | 774 | return -1; |
| 766 | 775 | } |
| ... | ... | |
| 823 | 832 | |
| 824 | 833 | int sdram_load(struct sdram_in *sdram_in) |
| 825 | 834 | { |
| 826 | | if (usb_get_ingenic_cpu(&ingenic_dev) < 3) { |
| 835 | int cpu = get_ingenic_cpu(); |
| 836 | if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) { |
| 827 | 837 | printf(" Device unboot! Boot it first!\n"); |
| 828 | 838 | return -1; |
| 829 | 839 | } |
| ... | ... | |
| 863 | 873 | |
| 864 | 874 | fd = open(file_path, O_RDONLY); |
| 865 | 875 | if (fd < 0) { |
| 866 | | fprintf(stderr, "Error - can't open file '%s': %s\n", |
| 876 | fprintf(stderr, "Error - can't open file '%s': %s\n", |
| 867 | 877 | file_path, strerror(errno)); |
| 868 | 878 | goto out; |
| 869 | 879 | } |
| ... | ... | |
| 878 | 888 | for (k = 0; k < m; k++) { |
| 879 | 889 | status = read(fd, sdram_in->buf, MAX_LOAD_SIZE); |
| 880 | 890 | if (status < MAX_LOAD_SIZE) { |
| 881 | | fprintf(stderr, "Error - can't read file '%s': %s\n", |
| 891 | fprintf(stderr, "Error - can't read file '%s': %s\n", |
| 882 | 892 | file_path, strerror(errno)); |
| 883 | 893 | goto close; |
| 884 | 894 | } |
| ... | ... | |
| 888 | 898 | goto close; |
| 889 | 899 | |
| 890 | 900 | sdram_in->start += MAX_LOAD_SIZE; |
| 891 | | if ( k % 60 == 0) |
| 901 | if ( k % 60 == 0) |
| 892 | 902 | printf(" 0x%x \n", sdram_in->start); |
| 893 | 903 | } |
| 894 | 904 | |
| 895 | 905 | if (j) { |
| 896 | | if (j % 4 !=0) |
| 906 | if (j % 4 !=0) |
| 897 | 907 | j += 4 - (j % 4); |
| 898 | 908 | status = read(fd, sdram_in->buf, j); |
| 899 | 909 | if (status < j) { |
| 900 | | fprintf(stderr, "Error - can't read file '%s': %s\n", |
| 910 | fprintf(stderr, "Error - can't read file '%s': %s\n", |
| 901 | 911 | file_path, strerror(errno)); |
| 902 | 912 | goto close; |
| 903 | 913 | } |
| ... | ... | |
| 917 | 927 | |
| 918 | 928 | int device_reset(int ops) |
| 919 | 929 | { |
| 920 | | if (usb_get_ingenic_cpu(&ingenic_dev) < 3) { |
| 930 | int cpu = get_ingenic_cpu(); |
| 931 | if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) { |
| 921 | 932 | printf(" Device unboot! Boot it first!\n"); |
| 922 | 933 | return -1; |
| 923 | 934 | } |