mirror of
git://projects.qi-hardware.com/xburst-tools.git
synced 2024-11-22 06:54:59 +02:00
Fix compile warnings
This commit is contained in:
parent
f2cb67abba
commit
5ade9f115b
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
|
@ -1,4 +1,9 @@
|
|||||||
AM_CFLAGS = -pedantic -Wall -W -DCFGDIR=\"$(cfgdir)\" -DDATADIR=\"$(pkgdatadir)\"
|
AM_CFLAGS = -DCFGDIR=\"$(cfgdir)\" -DDATADIR=\"$(pkgdatadir)\" \
|
||||||
|
-std=gnu99 \
|
||||||
|
-Wall -Wshadow -Wmissing-prototypes \
|
||||||
|
-Wmissing-declarations -Wno-format-zero-length \
|
||||||
|
-Wno-unused -Wno-implicit-function-declaration \
|
||||||
|
-Wno-missing-prototypes -Wno-missing-declarations
|
||||||
|
|
||||||
bin_PROGRAMS = usbboot
|
bin_PROGRAMS = usbboot
|
||||||
usbboot_SOURCES = cmd.c command_line.c ingenic_cfg.c \
|
usbboot_SOURCES = cmd.c command_line.c ingenic_cfg.c \
|
||||||
|
@ -28,38 +28,19 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <byteswap.h>
|
#include <byteswap.h>
|
||||||
#include "cmd.h"
|
#include "cmd.h"
|
||||||
|
#include "command_line.h"
|
||||||
#include "ingenic_cfg.h"
|
#include "ingenic_cfg.h"
|
||||||
#include "ingenic_usb.h"
|
#include "ingenic_usb.h"
|
||||||
#include "ingenic_request.h"
|
#include "ingenic_request.h"
|
||||||
#include "usb_boot_defines.h"
|
#include "usb_boot_defines.h"
|
||||||
|
|
||||||
extern int com_argc;
|
static int load_file(struct ingenic_dev *id, const char *file_path)
|
||||||
extern char com_argv[MAX_ARGC][MAX_COMMAND_LENGTH];
|
|
||||||
extern char * stage1;
|
|
||||||
|
|
||||||
struct ingenic_dev ingenic_dev;
|
|
||||||
struct hand hand;
|
|
||||||
struct sdram_in sdram_in;
|
|
||||||
struct nand_in nand_in;
|
|
||||||
|
|
||||||
unsigned int total_size;
|
|
||||||
unsigned char code_buf[4 * 512 * 1024];
|
|
||||||
unsigned char check_buf[4 * 512 * 1024];
|
|
||||||
unsigned char cs[16];
|
|
||||||
unsigned char ret[8];
|
|
||||||
|
|
||||||
static const char IMAGE_TYPE[][30] = {
|
|
||||||
"with oob and ecc",
|
|
||||||
"with oob and without ecc",
|
|
||||||
"without oob",
|
|
||||||
};
|
|
||||||
|
|
||||||
static int load_file(struct ingenic_dev *ingenic_dev, const char *file_path)
|
|
||||||
{
|
{
|
||||||
struct stat fstat;
|
struct stat fst;
|
||||||
|
struct fw_args *fw_args_copy;
|
||||||
int fd, status, res = -1;
|
int fd, status, res = -1;
|
||||||
|
|
||||||
status = stat(file_path, &fstat);
|
status = stat(file_path, &fst);
|
||||||
|
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
fprintf(stderr, "Error - can't get file size from '%s': %s\n",
|
fprintf(stderr, "Error - can't get file size from '%s': %s\n",
|
||||||
@ -67,8 +48,8 @@ static int load_file(struct ingenic_dev *ingenic_dev, const char *file_path)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ingenic_dev->file_len = fstat.st_size;
|
id->file_len = fst.st_size;
|
||||||
ingenic_dev->file_buff = code_buf;
|
id->file_buff = code_buf;
|
||||||
|
|
||||||
fd = open(file_path, O_RDONLY);
|
fd = open(file_path, O_RDONLY);
|
||||||
|
|
||||||
@ -78,15 +59,15 @@ static int load_file(struct ingenic_dev *ingenic_dev, const char *file_path)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = read(fd, ingenic_dev->file_buff, ingenic_dev->file_len);
|
status = read(fd, id->file_buff, id->file_len);
|
||||||
|
|
||||||
if (status < ingenic_dev->file_len) {
|
if (status < id->file_len) {
|
||||||
fprintf(stderr, "Error - can't read file '%s': %s\n",
|
fprintf(stderr, "Error - can't read file '%s': %s\n",
|
||||||
file_path, strerror(errno));
|
file_path, strerror(errno));
|
||||||
goto close;
|
goto close;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct fw_args *fw_args_copy = malloc(sizeof(struct fw_args));
|
fw_args_copy = malloc(sizeof(struct fw_args));
|
||||||
if (!fw_args_copy)
|
if (!fw_args_copy)
|
||||||
goto close;
|
goto close;
|
||||||
|
|
||||||
@ -100,7 +81,7 @@ static int load_file(struct ingenic_dev *ingenic_dev, const char *file_path)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* write args to code */
|
/* write args to code */
|
||||||
memcpy(ingenic_dev->file_buff + 8, fw_args_copy,
|
memcpy(id->file_buff + 8, fw_args_copy,
|
||||||
sizeof(struct fw_args));
|
sizeof(struct fw_args));
|
||||||
|
|
||||||
free(fw_args_copy);
|
free(fw_args_copy);
|
||||||
@ -145,16 +126,17 @@ int get_ingenic_cpu()
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* after upload stage2. must init device */
|
/* After upload stage2. we have to init the device */
|
||||||
void init_cfg()
|
void init_cfg()
|
||||||
{
|
{
|
||||||
|
struct hand *hand_copy;
|
||||||
int cpu = get_ingenic_cpu();
|
int cpu = get_ingenic_cpu();
|
||||||
if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) {
|
if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) {
|
||||||
printf(" Device unboot! boot it first!\n");
|
printf(" Device unboot! boot it first!\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct hand *hand_copy = malloc(sizeof(struct hand));
|
hand_copy = malloc(sizeof(struct hand));
|
||||||
if (!hand_copy)
|
if (!hand_copy)
|
||||||
goto xout;
|
goto xout;
|
||||||
|
|
||||||
@ -184,7 +166,7 @@ void init_cfg()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
ingenic_dev.file_buff = hand_copy;
|
ingenic_dev.file_buff = (unsigned char *)hand_copy;
|
||||||
ingenic_dev.file_len = sizeof(struct hand);
|
ingenic_dev.file_len = sizeof(struct hand);
|
||||||
if (usb_send_data_to_ingenic(&ingenic_dev) != 1)
|
if (usb_send_data_to_ingenic(&ingenic_dev) != 1)
|
||||||
goto xout;
|
goto xout;
|
||||||
@ -246,7 +228,7 @@ int error_check(unsigned char *org,unsigned char * obj,unsigned int size)
|
|||||||
printf(" Comparing %d bytes - ", size);
|
printf(" Comparing %d bytes - ", size);
|
||||||
for (i = 0; i < size; i++) {
|
for (i = 0; i < size; i++) {
|
||||||
if (org[i] != obj[i]) {
|
if (org[i] != obj[i]) {
|
||||||
unsigned int s = (i < 8) ? i : i - 8; // start_dump
|
unsigned int s = (i < 8) ? i : i - 8;
|
||||||
printf("FAIL at off %d, wrote 0x%x, read 0x%x\n", i, org[i], obj[i]);
|
printf("FAIL at off %d, wrote 0x%x, read 0x%x\n", i, org[i], obj[i]);
|
||||||
printf(" off %d write: %02x %02x %02x %02x %02x %02x %02x %02x"
|
printf(" off %d write: %02x %02x %02x %02x %02x %02x %02x %02x"
|
||||||
" %02x %02x %02x %02x %02x %02x %02x %02x\n", s,
|
" %02x %02x %02x %02x %02x %02x %02x %02x\n", s,
|
||||||
@ -265,15 +247,15 @@ int error_check(unsigned char *org,unsigned char * obj,unsigned int size)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int nand_markbad(struct nand_in *nand_in)
|
int nand_markbad(struct nand_in *ni)
|
||||||
{
|
{
|
||||||
int cpu = get_ingenic_cpu();
|
int cpu = get_ingenic_cpu();
|
||||||
if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) {
|
if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) {
|
||||||
printf(" Device unboot! boot it first!\n");
|
printf(" Device unboot! boot it first!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
printf(" Mark bad block : %d\n",nand_in->start);
|
printf(" Mark bad block : %d\n",ni->start);
|
||||||
usb_send_data_address_to_ingenic(&ingenic_dev, nand_in->start);
|
usb_send_data_address_to_ingenic(&ingenic_dev, ni->start);
|
||||||
usb_ingenic_nand_ops(&ingenic_dev, NAND_MARK_BAD);
|
usb_ingenic_nand_ops(&ingenic_dev, NAND_MARK_BAD);
|
||||||
usb_read_data_from_ingenic(&ingenic_dev, ret, 8);
|
usb_read_data_from_ingenic(&ingenic_dev, ret, 8);
|
||||||
printf(" Mark bad block at %d\n",((ret[3] << 24) |
|
printf(" Mark bad block at %d\n",((ret[3] << 24) |
|
||||||
@ -283,44 +265,45 @@ int nand_markbad(struct nand_in *nand_in)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int nand_program_check(struct nand_in *nand_in, unsigned int *start_page)
|
int nand_program_check(struct nand_in *ni, unsigned int *start_page)
|
||||||
{
|
{
|
||||||
unsigned int i, page_num, cur_page = -1;
|
unsigned int i, page_num, cur_page = -1;
|
||||||
unsigned int start_addr;
|
unsigned int start_addr;
|
||||||
unsigned short temp;
|
unsigned short temp;
|
||||||
|
int cpu;
|
||||||
int status = -1;
|
int status = -1;
|
||||||
|
|
||||||
printf(" Writing NAND page %d len %d...\n", nand_in->start, nand_in->length);
|
printf(" Writing NAND page %d len %d...\n", ni->start, ni->length);
|
||||||
if (nand_in->length > (unsigned int)MAX_TRANSFER_SIZE) {
|
if (ni->length > (unsigned int)MAX_TRANSFER_SIZE) {
|
||||||
printf(" Buffer size too long!\n");
|
printf(" Buffer size too long!\n");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu = get_ingenic_cpu();
|
cpu = get_ingenic_cpu();
|
||||||
if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) {
|
if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) {
|
||||||
printf(" Device unboot! boot it first!\n");
|
printf(" Device unboot! boot it first!\n");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
ingenic_dev.file_buff = nand_in->buf;
|
ingenic_dev.file_buff = ni->buf;
|
||||||
ingenic_dev.file_len = nand_in->length;
|
ingenic_dev.file_len = ni->length;
|
||||||
usb_send_data_to_ingenic(&ingenic_dev);
|
usb_send_data_to_ingenic(&ingenic_dev);
|
||||||
for (i = 0; i < nand_in->max_chip; i++) {
|
for (i = 0; i < ni->max_chip; i++) {
|
||||||
if ((nand_in->cs_map)[i] == 0)
|
if ((ni->cs_map)[i] == 0)
|
||||||
continue;
|
continue;
|
||||||
if (nand_in->option == NO_OOB) {
|
if (ni->option == NO_OOB) {
|
||||||
page_num = nand_in->length / hand.nand_ps;
|
page_num = ni->length / hand.nand_ps;
|
||||||
if ((nand_in->length % hand.nand_ps) !=0)
|
if ((ni->length % hand.nand_ps) !=0)
|
||||||
page_num++;
|
page_num++;
|
||||||
} else {
|
} else {
|
||||||
page_num = nand_in->length /
|
page_num = ni->length /
|
||||||
(hand.nand_ps + hand.nand_os);
|
(hand.nand_ps + hand.nand_os);
|
||||||
if ((nand_in->length% (hand.nand_ps + hand.nand_os)) !=0)
|
if ((ni->length% (hand.nand_ps + hand.nand_os)) !=0)
|
||||||
page_num++;
|
page_num++;
|
||||||
}
|
}
|
||||||
temp = ((nand_in->option << 12) & 0xf000) +
|
temp = ((ni->option << 12) & 0xf000) +
|
||||||
((i<<4) & 0xff0) + NAND_PROGRAM;
|
((i<<4) & 0xff0) + NAND_PROGRAM;
|
||||||
if (usb_send_data_address_to_ingenic(&ingenic_dev, nand_in->start) != 1)
|
if (usb_send_data_address_to_ingenic(&ingenic_dev, ni->start) != 1)
|
||||||
goto err;
|
goto err;
|
||||||
if (usb_send_data_length_to_ingenic(&ingenic_dev, page_num) != 1)
|
if (usb_send_data_length_to_ingenic(&ingenic_dev, page_num) != 1)
|
||||||
goto err;
|
goto err;
|
||||||
@ -330,13 +313,13 @@ int nand_program_check(struct nand_in *nand_in, unsigned int *start_page)
|
|||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
printf(" Finish! (len %d start_page %d page_num %d)\n",
|
printf(" Finish! (len %d start_page %d page_num %d)\n",
|
||||||
nand_in->length, nand_in->start, page_num);
|
ni->length, ni->start, page_num);
|
||||||
|
|
||||||
/* Read back to check! */
|
/* Read back to check! */
|
||||||
usb_send_data_address_to_ingenic(&ingenic_dev, nand_in->start);
|
usb_send_data_address_to_ingenic(&ingenic_dev, ni->start);
|
||||||
usb_send_data_length_to_ingenic(&ingenic_dev, page_num);
|
usb_send_data_length_to_ingenic(&ingenic_dev, page_num);
|
||||||
|
|
||||||
switch (nand_in->option) {
|
switch (ni->option) {
|
||||||
case OOB_ECC:
|
case OOB_ECC:
|
||||||
temp = ((OOB_ECC << 12) & 0xf000) +
|
temp = ((OOB_ECC << 12) & 0xf000) +
|
||||||
((i << 4) & 0xff0) + NAND_READ;
|
((i << 4) & 0xff0) + NAND_READ;
|
||||||
@ -348,15 +331,14 @@ int nand_program_check(struct nand_in *nand_in, unsigned int *start_page)
|
|||||||
start_addr = page_num * (hand.nand_ps + hand.nand_os);
|
start_addr = page_num * (hand.nand_ps + hand.nand_os);
|
||||||
break;
|
break;
|
||||||
case NO_OOB:
|
case NO_OOB:
|
||||||
|
default:
|
||||||
temp = ((NO_OOB << 12) & 0xf000) +
|
temp = ((NO_OOB << 12) & 0xf000) +
|
||||||
((i << 4) & 0xff0) + NAND_READ;
|
((i << 4) & 0xff0) + NAND_READ;
|
||||||
start_addr = page_num * hand.nand_ps;
|
start_addr = page_num * hand.nand_ps;
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
printf(" Checking %d bytes...", nand_in->length);
|
printf(" Checking %d bytes...", ni->length);
|
||||||
usb_ingenic_nand_ops(&ingenic_dev, temp);
|
usb_ingenic_nand_ops(&ingenic_dev, temp);
|
||||||
usb_read_data_from_ingenic(&ingenic_dev, check_buf, start_addr);
|
usb_read_data_from_ingenic(&ingenic_dev, check_buf, start_addr);
|
||||||
usb_read_data_from_ingenic(&ingenic_dev, ret, 8);
|
usb_read_data_from_ingenic(&ingenic_dev, ret, 8);
|
||||||
@ -364,17 +346,19 @@ int nand_program_check(struct nand_in *nand_in, unsigned int *start_page)
|
|||||||
cur_page = (ret[3] << 24) | (ret[2] << 16) | (ret[1] << 8) |
|
cur_page = (ret[3] << 24) | (ret[2] << 16) | (ret[1] << 8) |
|
||||||
(ret[0] << 0);
|
(ret[0] << 0);
|
||||||
|
|
||||||
if (nand_in->start == 0 && hand.nand_ps == 4096 &&
|
if (ni->start == 0 && hand.nand_ps == 4096 &&
|
||||||
hand.fw_args.cpu_id == 0x4740) {
|
hand.fw_args.cpu_id == 0x4740) {
|
||||||
printf(" No check! end at page: %d\n", cur_page);
|
printf(" No check! end at page: %d\n", cur_page);
|
||||||
fflush(NULL);
|
fflush(NULL);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!nand_in->check(nand_in->buf, check_buf, nand_in->length)) {
|
if (!ni->check(ni->buf, check_buf, ni->length)) {
|
||||||
struct nand_in bad;
|
struct nand_in bad;
|
||||||
// tbd: doesn't the other side skip bad blocks too? Can we just deduct 1 from cur_page?
|
/*
|
||||||
// tbd: why do we only mark a block as bad if the last page in the block was written?
|
* tbd: doesn't the other side skip bad blocks too? Can we just deduct 1 from cur_page?
|
||||||
|
* tbd: why do we only mark a block as bad if the last page in the block was written?
|
||||||
|
*/
|
||||||
bad.start = (cur_page - 1) / hand.nand_ppb;
|
bad.start = (cur_page - 1) / hand.nand_ppb;
|
||||||
if (cur_page % hand.nand_ppb == 0)
|
if (cur_page % hand.nand_ppb == 0)
|
||||||
nand_markbad(&bad);
|
nand_markbad(&bad);
|
||||||
@ -391,13 +375,15 @@ err:
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int nand_erase(struct nand_in *nand_in)
|
int nand_erase(struct nand_in *ni)
|
||||||
{
|
{
|
||||||
unsigned int start_blk, blk_num, end_block;
|
unsigned int start_blk, blk_num, end_block;
|
||||||
|
unsigned short temp;
|
||||||
|
int cpu;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
start_blk = nand_in->start;
|
start_blk = ni->start;
|
||||||
blk_num = nand_in->length;
|
blk_num = ni->length;
|
||||||
if (start_blk > (unsigned int)NAND_MAX_BLK_NUM) {
|
if (start_blk > (unsigned int)NAND_MAX_BLK_NUM) {
|
||||||
printf(" Start block number overflow!\n");
|
printf(" Start block number overflow!\n");
|
||||||
return -1;
|
return -1;
|
||||||
@ -407,22 +393,22 @@ int nand_erase(struct nand_in *nand_in)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu = get_ingenic_cpu();
|
cpu = get_ingenic_cpu();
|
||||||
if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) {
|
if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) {
|
||||||
printf(" Device unboot! boot it first!\n");
|
printf(" Device unboot! boot it first!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < nand_in->max_chip; i++) {
|
for (i = 0; i < ni->max_chip; i++) {
|
||||||
if ((nand_in->cs_map)[i]==0)
|
if ((ni->cs_map)[i]==0)
|
||||||
continue;
|
continue;
|
||||||
printf(" Erasing No.%d device No.%d flash (start_blk %u blk_num %u)......\n",
|
printf(" Erasing No.%d device No.%d flash (start_blk %u blk_num %u)......\n",
|
||||||
nand_in->dev, i, start_blk, blk_num);
|
ni->dev, i, start_blk, blk_num);
|
||||||
|
|
||||||
usb_send_data_address_to_ingenic(&ingenic_dev, start_blk);
|
usb_send_data_address_to_ingenic(&ingenic_dev, start_blk);
|
||||||
usb_send_data_length_to_ingenic(&ingenic_dev, blk_num);
|
usb_send_data_length_to_ingenic(&ingenic_dev, blk_num);
|
||||||
|
|
||||||
unsigned short temp = ((i << 4) & 0xff0) + NAND_ERASE;
|
temp = ((i << 4) & 0xff0) + NAND_ERASE;
|
||||||
usb_ingenic_nand_ops(&ingenic_dev, temp);
|
usb_ingenic_nand_ops(&ingenic_dev, temp);
|
||||||
|
|
||||||
usb_read_data_from_ingenic(&ingenic_dev, ret, 8);
|
usb_read_data_from_ingenic(&ingenic_dev, ret, 8);
|
||||||
@ -446,23 +432,23 @@ int nand_erase(struct nand_in *nand_in)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int nand_program_file(struct nand_in *nand_in, char *fname)
|
int nand_program_file(struct nand_in *ni, char *fname)
|
||||||
{
|
{
|
||||||
|
|
||||||
int flen, m, j, k;
|
int flen, m, j, k;
|
||||||
unsigned int start_page = 0, page_num, code_len, offset, transfer_size;
|
unsigned int start_page = 0, code_len, offset, transfer_size;
|
||||||
int fd, status;
|
int fd, status;
|
||||||
struct stat fstat;
|
struct stat fst;
|
||||||
struct nand_in n_in;
|
struct nand_in n_in;
|
||||||
|
|
||||||
status = stat(fname, &fstat);
|
status = stat(fname, &fst);
|
||||||
|
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
fprintf(stderr, "Error - can't get file size from '%s': %s\n",
|
fprintf(stderr, "Error - can't get file size from '%s': %s\n",
|
||||||
fname, strerror(errno));
|
fname, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
flen = fstat.st_size;
|
flen = fst.st_size;
|
||||||
|
|
||||||
fd = open(fname, O_RDONLY);
|
fd = open(fname, O_RDONLY);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
@ -471,9 +457,9 @@ int nand_program_file(struct nand_in *nand_in, char *fname)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf(" Programing No.%d device, flen %d, start page %d...\n",nand_in->dev, flen, nand_in->start);
|
printf(" Programing No.%d device, flen %d, start page %d...\n",ni->dev, flen, ni->start);
|
||||||
n_in.start = nand_in->start / hand.nand_ppb;
|
n_in.start = ni->start / hand.nand_ppb;
|
||||||
if (nand_in->option == NO_OOB) {
|
if (ni->option == NO_OOB) {
|
||||||
if (flen % (hand.nand_ppb * hand.nand_ps) == 0)
|
if (flen % (hand.nand_ppb * hand.nand_ps) == 0)
|
||||||
n_in.length = flen / (hand.nand_ps * hand.nand_ppb);
|
n_in.length = flen / (hand.nand_ps * hand.nand_ppb);
|
||||||
else
|
else
|
||||||
@ -487,12 +473,12 @@ int nand_program_file(struct nand_in *nand_in, char *fname)
|
|||||||
((hand.nand_ps + hand.nand_os) * hand.nand_ppb)
|
((hand.nand_ps + hand.nand_os) * hand.nand_ppb)
|
||||||
+ 1;
|
+ 1;
|
||||||
}
|
}
|
||||||
n_in.cs_map = nand_in->cs_map;
|
n_in.cs_map = ni->cs_map;
|
||||||
n_in.dev = nand_in->dev;
|
n_in.dev = ni->dev;
|
||||||
n_in.max_chip = nand_in->max_chip;
|
n_in.max_chip = ni->max_chip;
|
||||||
if (nand_erase(&n_in) != 1)
|
if (nand_erase(&n_in) != 1)
|
||||||
return -1;
|
return -1;
|
||||||
if (nand_in->option == NO_OOB)
|
if (ni->option == NO_OOB)
|
||||||
transfer_size = (hand.nand_ppb * hand.nand_ps);
|
transfer_size = (hand.nand_ppb * hand.nand_ps);
|
||||||
else
|
else
|
||||||
transfer_size = (hand.nand_ppb * (hand.nand_ps + hand.nand_os));
|
transfer_size = (hand.nand_ppb * (hand.nand_ps + hand.nand_os));
|
||||||
@ -500,17 +486,12 @@ int nand_program_file(struct nand_in *nand_in, char *fname)
|
|||||||
m = flen / transfer_size;
|
m = flen / transfer_size;
|
||||||
j = flen % transfer_size;
|
j = flen % transfer_size;
|
||||||
printf(" Size to send %d, transfer_size %d\n", flen, transfer_size);
|
printf(" Size to send %d, transfer_size %d\n", flen, transfer_size);
|
||||||
printf(" Image type : %s\n", IMAGE_TYPE[nand_in->option]);
|
printf(" Image type : %s\n", IMAGE_TYPE[ni->option]);
|
||||||
printf(" It will cause %d times buffer transfer.\n", j == 0 ? m : m + 1);
|
printf(" It will cause %d times buffer transfer.\n", j == 0 ? m : m + 1);
|
||||||
fflush(NULL);
|
fflush(NULL);
|
||||||
|
|
||||||
offset = 0;
|
offset = 0;
|
||||||
for (k = 0; k < m; k++) {
|
for (k = 0; k < m; k++) {
|
||||||
if (nand_in->option == NO_OOB)
|
|
||||||
page_num = transfer_size / hand.nand_ps;
|
|
||||||
else
|
|
||||||
page_num = transfer_size / (hand.nand_ps + hand.nand_os);
|
|
||||||
|
|
||||||
code_len = transfer_size;
|
code_len = transfer_size;
|
||||||
status = read(fd, code_buf, code_len);
|
status = read(fd, code_buf, code_len);
|
||||||
if (status < code_len) {
|
if (status < code_len) {
|
||||||
@ -519,14 +500,14 @@ int nand_program_file(struct nand_in *nand_in, char *fname)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
nand_in->length = code_len; /* code length,not page number! */
|
ni->length = code_len; /* code length,not page number! */
|
||||||
nand_in->buf = code_buf;
|
ni->buf = code_buf;
|
||||||
if (nand_program_check(nand_in, &start_page) == -1)
|
if (nand_program_check(ni, &start_page) == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (start_page - nand_in->start > hand.nand_ppb)
|
if (start_page - ni->start > hand.nand_ppb)
|
||||||
printf(" Info - skip bad block!\n");
|
printf(" Info - skip bad block!\n");
|
||||||
nand_in->start = start_page;
|
ni->start = start_page;
|
||||||
|
|
||||||
offset += code_len ;
|
offset += code_len ;
|
||||||
}
|
}
|
||||||
@ -545,12 +526,12 @@ int nand_program_file(struct nand_in *nand_in, char *fname)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
nand_in->length = j;
|
ni->length = j;
|
||||||
nand_in->buf = code_buf;
|
ni->buf = code_buf;
|
||||||
if (nand_program_check(nand_in, &start_page) == -1)
|
if (nand_program_check(ni, &start_page) == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (start_page - nand_in->start > hand.nand_ppb)
|
if (start_page - ni->start > hand.nand_ppb)
|
||||||
printf(" Info - skip bad block!");
|
printf(" Info - skip bad block!");
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -559,12 +540,6 @@ int nand_program_file(struct nand_in *nand_in, char *fname)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int nand_program_file_planes(struct nand_in *nand_in, char *fname)
|
|
||||||
{
|
|
||||||
printf(" not implement yet !\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int init_nand_in(void)
|
int init_nand_in(void)
|
||||||
{
|
{
|
||||||
nand_in.buf = code_buf;
|
nand_in.buf = code_buf;
|
||||||
@ -612,20 +587,19 @@ int nand_prog(void)
|
|||||||
else
|
else
|
||||||
printf("%s", help);
|
printf("%s", help);
|
||||||
|
|
||||||
if (hand.nand_plane > 1)
|
if (hand.nand_plane == 1)
|
||||||
nand_program_file_planes(&nand_in, image_file);
|
|
||||||
else
|
|
||||||
nand_program_file(&nand_in, image_file);
|
nand_program_file(&nand_in, image_file);
|
||||||
|
|
||||||
status = 1;
|
status = 1;
|
||||||
err:
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int nand_query(void)
|
int nand_query(void)
|
||||||
{
|
{
|
||||||
int i;
|
int cpu, i;
|
||||||
unsigned char csn;
|
unsigned char csn;
|
||||||
|
unsigned short ops;
|
||||||
|
|
||||||
if (com_argc < 3) {
|
if (com_argc < 3) {
|
||||||
printf(" Usage: nquery (1) (2)\n"
|
printf(" Usage: nquery (1) (2)\n"
|
||||||
@ -645,7 +619,7 @@ int nand_query(void)
|
|||||||
if (i >= nand_in.max_chip)
|
if (i >= nand_in.max_chip)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
int cpu = get_ingenic_cpu();
|
cpu = get_ingenic_cpu();
|
||||||
if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) {
|
if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) {
|
||||||
printf(" Device unboot! boot it first!\n");
|
printf(" Device unboot! boot it first!\n");
|
||||||
return -1;
|
return -1;
|
||||||
@ -654,7 +628,7 @@ int nand_query(void)
|
|||||||
csn = i;
|
csn = i;
|
||||||
printf(" ID of No.%d device No.%d flash: \n", nand_in.dev, csn);
|
printf(" ID of No.%d device No.%d flash: \n", nand_in.dev, csn);
|
||||||
|
|
||||||
unsigned short ops = ((csn << 4) & 0xff0) + NAND_QUERY;
|
ops = ((csn << 4) & 0xff0) + NAND_QUERY;
|
||||||
usb_ingenic_nand_ops(&ingenic_dev, ops);
|
usb_ingenic_nand_ops(&ingenic_dev, ops);
|
||||||
usb_read_data_from_ingenic(&ingenic_dev, ret, 8);
|
usb_read_data_from_ingenic(&ingenic_dev, ret, 8);
|
||||||
printf(" Vendor ID :0x%x \n",(unsigned char)ret[0]);
|
printf(" Vendor ID :0x%x \n",(unsigned char)ret[0]);
|
||||||
@ -670,7 +644,7 @@ int nand_query(void)
|
|||||||
|
|
||||||
int nand_read(int mode)
|
int nand_read(int mode)
|
||||||
{
|
{
|
||||||
unsigned int i, j, cpu;
|
unsigned int cpu, j;
|
||||||
unsigned int start_addr, length, page_num;
|
unsigned int start_addr, length, page_num;
|
||||||
unsigned char csn;
|
unsigned char csn;
|
||||||
unsigned short temp = 0;
|
unsigned short temp = 0;
|
||||||
@ -752,7 +726,7 @@ int nand_read(int mode)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int debug_memory(int obj, unsigned int start, unsigned int size)
|
int debug_memory(unsigned int start, unsigned int size)
|
||||||
{
|
{
|
||||||
unsigned int buffer[8],tmp;
|
unsigned int buffer[8],tmp;
|
||||||
|
|
||||||
@ -790,7 +764,7 @@ int debug_memory(int obj, unsigned int start, unsigned int size)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
usleep(100);
|
usleep(100);
|
||||||
usb_read_data_from_ingenic(&ingenic_dev, buffer, 8);
|
usb_read_data_from_ingenic(&ingenic_dev, (unsigned char *)buffer, 8);
|
||||||
if (buffer[0] != 0)
|
if (buffer[0] != 0)
|
||||||
printf(" Test memory fail! Last error address is 0x%x !\n",
|
printf(" Test memory fail! Last error address is 0x%x !\n",
|
||||||
buffer[0]);
|
buffer[0]);
|
||||||
@ -800,7 +774,7 @@ int debug_memory(int obj, unsigned int start, unsigned int size)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int debug_gpio(int obj, unsigned char ops, unsigned char pin)
|
int debug_gpio(unsigned char ops, unsigned char pin)
|
||||||
{
|
{
|
||||||
unsigned int tmp;
|
unsigned int tmp;
|
||||||
|
|
||||||
@ -866,7 +840,7 @@ int debug_go(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sdram_load(struct sdram_in *sdram_in)
|
int sdram_load(struct sdram_in *si)
|
||||||
{
|
{
|
||||||
int cpu = get_ingenic_cpu();
|
int cpu = get_ingenic_cpu();
|
||||||
if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) {
|
if (cpu != BOOT4740 && cpu != BOOT4750 && cpu != BOOT4760) {
|
||||||
@ -874,17 +848,17 @@ int sdram_load(struct sdram_in *sdram_in)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sdram_in->length > (unsigned int) MAX_LOAD_SIZE) {
|
if (si->length > (unsigned int) MAX_LOAD_SIZE) {
|
||||||
printf(" Image length too long!\n");
|
printf(" Image length too long!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ingenic_dev.file_buff = sdram_in->buf;
|
ingenic_dev.file_buff = si->buf;
|
||||||
ingenic_dev.file_len = sdram_in->length;
|
ingenic_dev.file_len = si->length;
|
||||||
usb_send_data_to_ingenic(&ingenic_dev);
|
usb_send_data_to_ingenic(&ingenic_dev);
|
||||||
usb_send_data_address_to_ingenic(&ingenic_dev, sdram_in->start);
|
usb_send_data_address_to_ingenic(&ingenic_dev, si->start);
|
||||||
usb_send_data_length_to_ingenic(&ingenic_dev, sdram_in->length);
|
usb_send_data_length_to_ingenic(&ingenic_dev, si->length);
|
||||||
usb_ingenic_sdram_ops(&ingenic_dev, sdram_in);
|
usb_ingenic_sdram_ops(&ingenic_dev, SDRAM_LOAD);
|
||||||
|
|
||||||
usb_read_data_from_ingenic(&ingenic_dev, ret, 8);
|
usb_read_data_from_ingenic(&ingenic_dev, ret, 8);
|
||||||
printf(" Load last address at 0x%x\n",
|
printf(" Load last address at 0x%x\n",
|
||||||
@ -893,19 +867,19 @@ int sdram_load(struct sdram_in *sdram_in)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sdram_load_file(struct sdram_in *sdram_in, char *file_path)
|
int sdram_load_file(struct sdram_in *si, char *file_path)
|
||||||
{
|
{
|
||||||
struct stat fstat;
|
struct stat fst;
|
||||||
unsigned int flen,m,j,offset,k;
|
unsigned int flen, m, j, k;
|
||||||
int fd, status, res = -1;
|
int fd, status, res = -1;
|
||||||
|
|
||||||
status = stat(file_path, &fstat);
|
status = stat(file_path, &fst);
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
fprintf(stderr, "Error - can't get file size from '%s': %s\n",
|
fprintf(stderr, "Error - can't get file size from '%s': %s\n",
|
||||||
file_path, strerror(errno));
|
file_path, strerror(errno));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
flen = fstat.st_size;
|
flen = fst.st_size;
|
||||||
|
|
||||||
fd = open(file_path, O_RDONLY);
|
fd = open(file_path, O_RDONLY);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
@ -916,40 +890,39 @@ int sdram_load_file(struct sdram_in *sdram_in, char *file_path)
|
|||||||
|
|
||||||
m = flen / MAX_LOAD_SIZE;
|
m = flen / MAX_LOAD_SIZE;
|
||||||
j = flen % MAX_LOAD_SIZE;
|
j = flen % MAX_LOAD_SIZE;
|
||||||
offset = 0;
|
|
||||||
|
|
||||||
printf(" Total size to send in byte is :%d\n", flen);
|
printf(" Total size to send in byte is :%d\n", flen);
|
||||||
printf(" Loading data to SDRAM :\n");
|
printf(" Loading data to SDRAM :\n");
|
||||||
|
|
||||||
for (k = 0; k < m; k++) {
|
for (k = 0; k < m; k++) {
|
||||||
status = read(fd, sdram_in->buf, MAX_LOAD_SIZE);
|
status = read(fd, si->buf, MAX_LOAD_SIZE);
|
||||||
if (status < MAX_LOAD_SIZE) {
|
if (status < MAX_LOAD_SIZE) {
|
||||||
fprintf(stderr, "Error - can't read file '%s': %s\n",
|
fprintf(stderr, "Error - can't read file '%s': %s\n",
|
||||||
file_path, strerror(errno));
|
file_path, strerror(errno));
|
||||||
goto close;
|
goto close;
|
||||||
}
|
}
|
||||||
|
|
||||||
sdram_in->length = MAX_LOAD_SIZE;
|
si->length = MAX_LOAD_SIZE;
|
||||||
if (sdram_load(sdram_in) < 1)
|
if (sdram_load(si) < 1)
|
||||||
goto close;
|
goto close;
|
||||||
|
|
||||||
sdram_in->start += MAX_LOAD_SIZE;
|
si->start += MAX_LOAD_SIZE;
|
||||||
if ( k % 60 == 0)
|
if ( k % 60 == 0)
|
||||||
printf(" 0x%x \n", sdram_in->start);
|
printf(" 0x%x \n", si->start);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (j) {
|
if (j) {
|
||||||
if (j % 4 !=0)
|
if (j % 4 !=0)
|
||||||
j += 4 - (j % 4);
|
j += 4 - (j % 4);
|
||||||
status = read(fd, sdram_in->buf, j);
|
status = read(fd, si->buf, j);
|
||||||
if (status < j) {
|
if (status < j) {
|
||||||
fprintf(stderr, "Error - can't read file '%s': %s\n",
|
fprintf(stderr, "Error - can't read file '%s': %s\n",
|
||||||
file_path, strerror(errno));
|
file_path, strerror(errno));
|
||||||
goto close;
|
goto close;
|
||||||
}
|
}
|
||||||
|
|
||||||
sdram_in->length = j;
|
si->length = j;
|
||||||
if (sdram_load(sdram_in) < 1)
|
if (sdram_load(si) < 1)
|
||||||
goto close;
|
goto close;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,17 +22,35 @@
|
|||||||
#include "usb_boot_defines.h"
|
#include "usb_boot_defines.h"
|
||||||
|
|
||||||
#define COMMAND_NUM 31
|
#define COMMAND_NUM 31
|
||||||
#define MAX_ARGC 10
|
|
||||||
#define MAX_COMMAND_LENGTH 100
|
struct ingenic_dev ingenic_dev;
|
||||||
|
struct hand hand;
|
||||||
|
struct sdram_in sdram_in;
|
||||||
|
struct nand_in nand_in;
|
||||||
|
|
||||||
|
unsigned int total_size;
|
||||||
|
unsigned char code_buf[4 * 512 * 1024];
|
||||||
|
unsigned char check_buf[4 * 512 * 1024];
|
||||||
|
unsigned char cs[16];
|
||||||
|
unsigned char ret[8];
|
||||||
|
|
||||||
|
static const char IMAGE_TYPE[][30] = {
|
||||||
|
"with oob and ecc",
|
||||||
|
"with oob and without ecc",
|
||||||
|
"without oob",
|
||||||
|
};
|
||||||
|
|
||||||
int boot(char *stage1_path, char *stage2_path);
|
int boot(char *stage1_path, char *stage2_path);
|
||||||
int init_nand_in();
|
int init_nand_in();
|
||||||
|
int nand_read(int mode);
|
||||||
int nand_prog(void);
|
int nand_prog(void);
|
||||||
int nand_query(void);
|
int nand_query(void);
|
||||||
int nand_erase(struct nand_in *nand_in);
|
int nand_erase(struct nand_in *nand_in);
|
||||||
int debug_memory(int obj, unsigned int start, unsigned int size);
|
int debug_memory(unsigned int start, unsigned int size);
|
||||||
int debug_gpio(int obj, unsigned char ops, unsigned char pin);
|
int debug_gpio(unsigned char ops, unsigned char pin);
|
||||||
int debug_go(void);
|
int debug_go(void);
|
||||||
int device_reset(int ops);
|
int device_reset(int ops);
|
||||||
|
int nand_markbad(struct nand_in *nand_in);
|
||||||
|
int sdram_load_file(struct sdram_in *sdram_in, char *file_path);
|
||||||
|
|
||||||
#endif /* __CMD_H__ */
|
#endif /* __CMD_H__ */
|
||||||
|
@ -21,24 +21,16 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "usb_boot_defines.h"
|
#include "usb_boot_defines.h"
|
||||||
#include "ingenic_usb.h"
|
#include "ingenic_usb.h"
|
||||||
|
#include "command_line.h"
|
||||||
#include "cmd.h"
|
#include "cmd.h"
|
||||||
|
|
||||||
extern struct nand_in nand_in;
|
|
||||||
extern struct sdram_in sdram_in;
|
|
||||||
extern unsigned char code_buf[4 * 512 * 1024];
|
|
||||||
|
|
||||||
int com_argc;
|
|
||||||
char com_argv[MAX_ARGC][MAX_COMMAND_LENGTH];
|
|
||||||
char * stage1;
|
|
||||||
char * stage2;
|
|
||||||
|
|
||||||
static int handle_help(void)
|
static int handle_help(void)
|
||||||
{
|
{
|
||||||
printf(
|
printf(
|
||||||
" boot boot device and make it in stage2\n"
|
" boot boot device and make it in stage2\n"
|
||||||
" reset reset device\n"
|
" reset reset device\n"
|
||||||
" nprog program NAND flash\n"
|
|
||||||
" nquery query NAND flash info\n"
|
" nquery query NAND flash info\n"
|
||||||
|
" nprog program NAND flash\n"
|
||||||
" nerase erase NAND flash\n"
|
" nerase erase NAND flash\n"
|
||||||
" nmark mark a bad block in NAND flash\n"
|
" nmark mark a bad block in NAND flash\n"
|
||||||
" nread read NAND flash data with checking bad block and ECC\n"
|
" nread read NAND flash data with checking bad block and ECC\n"
|
||||||
@ -128,7 +120,7 @@ int handle_memtest(void)
|
|||||||
size = 0;
|
size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug_memory(atoi(com_argv[1]), start, size);
|
debug_memory(start, size);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,7 +134,7 @@ int handle_gpio(int mode)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug_gpio(atoi(com_argv[2]), mode, atoi(com_argv[1]));
|
debug_gpio(mode, atoi(com_argv[1]));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,7 +167,7 @@ int command_handle(char *buf)
|
|||||||
com_argc = 0;
|
com_argc = 0;
|
||||||
strcpy(com_argv[com_argc++], p);
|
strcpy(com_argv[com_argc++], p);
|
||||||
|
|
||||||
while (p = strtok(NULL, "\n "))
|
while ((p = strtok(NULL, "\n ")) != NULL)
|
||||||
strcpy(com_argv[com_argc++], p);
|
strcpy(com_argv[com_argc++], p);
|
||||||
|
|
||||||
if (!strcmp("boot", com_argv[0]))
|
if (!strcmp("boot", com_argv[0]))
|
||||||
@ -211,7 +203,7 @@ int command_handle(char *buf)
|
|||||||
else if (!strcmp("exit", com_argv[0]))
|
else if (!strcmp("exit", com_argv[0]))
|
||||||
return -1;
|
return -1;
|
||||||
else
|
else
|
||||||
printf(" type `help` show all commands\n", com_argv[0]);
|
printf(" type `help` show all commands\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,14 @@
|
|||||||
#ifndef __COMMAND_LINE_H__
|
#ifndef __COMMAND_LINE_H__
|
||||||
#define __COMMAND_LINE_H__
|
#define __COMMAND_LINE_H__
|
||||||
|
|
||||||
|
#define MAX_ARGC 10
|
||||||
|
#define MAX_COMMAND_LENGTH 100
|
||||||
|
|
||||||
|
int com_argc;
|
||||||
|
char com_argv[MAX_ARGC][MAX_COMMAND_LENGTH];
|
||||||
|
char *stage1;
|
||||||
|
char *stage2;
|
||||||
|
|
||||||
int command_handle(char *buf);
|
int command_handle(char *buf);
|
||||||
|
|
||||||
#endif /* __COMMAND_LINE_H__ */
|
#endif /* __COMMAND_LINE_H__ */
|
||||||
|
@ -25,60 +25,60 @@
|
|||||||
|
|
||||||
extern unsigned int total_size;
|
extern unsigned int total_size;
|
||||||
|
|
||||||
int check_dump_cfg(struct hand *hand)
|
int check_dump_cfg(struct hand *h)
|
||||||
{
|
{
|
||||||
printf("Now checking whether all configure args valid:");
|
printf("Now checking whether all configure args valid:");
|
||||||
/* check PLL */
|
/* check PLL */
|
||||||
if (hand->fw_args.ext_clk > 27 || hand->fw_args.ext_clk < 12) {
|
if (h->fw_args.ext_clk > 27 || h->fw_args.ext_clk < 12) {
|
||||||
printf(" EXTCLK setting invalid!\n");
|
printf(" EXTCLK setting invalid!\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (hand->fw_args.phm_div > 32 || hand->fw_args.ext_clk < 2) {
|
if (h->fw_args.phm_div > 32 || h->fw_args.ext_clk < 2) {
|
||||||
printf(" PHMDIV setting invalid!\n");
|
printf(" PHMDIV setting invalid!\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ((hand->fw_args.cpu_speed * hand->fw_args.ext_clk ) % 12 != 0) {
|
if ((h->fw_args.cpu_speed * h->fw_args.ext_clk ) % 12 != 0) {
|
||||||
printf(" CPUSPEED setting invalid!\n");
|
printf(" CPUSPEED setting invalid!\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check SDRAM */
|
/* check SDRAM */
|
||||||
if (hand->fw_args.bus_width > 1 ) {
|
if (h->fw_args.bus_width > 1 ) {
|
||||||
printf(" SDRAMWIDTH setting invalid!\n");
|
printf(" SDRAMWIDTH setting invalid!\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (hand->fw_args.bank_num > 1 ) {
|
if (h->fw_args.bank_num > 1 ) {
|
||||||
printf(" BANKNUM setting invalid!\n");
|
printf(" BANKNUM setting invalid!\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (hand->fw_args.row_addr > 13 && hand->fw_args.row_addr < 11 ) {
|
if (h->fw_args.row_addr > 13 && h->fw_args.row_addr < 11 ) {
|
||||||
printf(" ROWADDR setting invalid!\n");
|
printf(" ROWADDR setting invalid!\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (hand->fw_args.col_addr > 13 && hand->fw_args.col_addr < 11 ) {
|
if (h->fw_args.col_addr > 13 && h->fw_args.col_addr < 11 ) {
|
||||||
printf(" COLADDR setting invalid!\n");
|
printf(" COLADDR setting invalid!\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check NAND */
|
/* check NAND */
|
||||||
if (hand->nand_ps < 2048 && hand->nand_os > 16) {
|
if (h->nand_ps < 2048 && h->nand_os > 16) {
|
||||||
printf(" PAGESIZE or OOBSIZE setting invalid!\n");
|
printf(" PAGESIZE or OOBSIZE setting invalid!\n");
|
||||||
printf(" PAGESIZE is %d,\t OOBSIZE is %d\n",
|
printf(" PAGESIZE is %d,\t OOBSIZE is %d\n",
|
||||||
hand->nand_ps, hand->nand_os);
|
h->nand_ps, h->nand_os);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (hand->nand_ps < 2048 && hand->nand_ppb > 32) {
|
if (h->nand_ps < 2048 && h->nand_ppb > 32) {
|
||||||
printf(" PAGESIZE or PAGEPERBLOCK setting invalid!\n");
|
printf(" PAGESIZE or PAGEPERBLOCK setting invalid!\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hand->nand_ps > 512 && hand->nand_os <= 16) {
|
if (h->nand_ps > 512 && h->nand_os <= 16) {
|
||||||
printf(" PAGESIZE or OOBSIZE setting invalid!\n");
|
printf(" PAGESIZE or OOBSIZE setting invalid!\n");
|
||||||
printf(" PAGESIZE is %d,\t OOBSIZE is %d\n",
|
printf(" PAGESIZE is %d,\t OOBSIZE is %d\n",
|
||||||
hand->nand_ps, hand->nand_os);
|
h->nand_ps, h->nand_os);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (hand->nand_ps > 512 && hand->nand_ppb < 64) {
|
if (h->nand_ps > 512 && h->nand_ppb < 64) {
|
||||||
printf(" PAGESIZE or PAGEPERBLOCK setting invalid!\n");
|
printf(" PAGESIZE or PAGEPERBLOCK setting invalid!\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -86,13 +86,13 @@ int check_dump_cfg(struct hand *hand)
|
|||||||
|
|
||||||
printf("Current device setup information:\n");
|
printf("Current device setup information:\n");
|
||||||
printf("Crystal work at %dMHz, the CCLK up to %dMHz and PMH_CLK up to %dMHz\n",
|
printf("Crystal work at %dMHz, the CCLK up to %dMHz and PMH_CLK up to %dMHz\n",
|
||||||
hand->fw_args.ext_clk,
|
h->fw_args.ext_clk,
|
||||||
(unsigned int)hand->fw_args.cpu_speed * hand->fw_args.ext_clk,
|
(unsigned int)h->fw_args.cpu_speed * h->fw_args.ext_clk,
|
||||||
((unsigned int)hand->fw_args.cpu_speed * hand->fw_args.ext_clk) / hand->fw_args.phm_div);
|
((unsigned int)h->fw_args.cpu_speed * h->fw_args.ext_clk) / h->fw_args.phm_div);
|
||||||
|
|
||||||
printf("SDRAM Total size is %d MB, work in %d bank and %d bit mode\n",
|
printf("SDRAM Total size is %d MB, work in %d bank and %d bit mode\n",
|
||||||
total_size / 0x100000, 2 * (hand->fw_args.bank_num + 1),
|
total_size / 0x100000, 2 * (h->fw_args.bank_num + 1),
|
||||||
16 * (2 - hand->fw_args.bus_width));
|
16 * (2 - h->fw_args.bus_width));
|
||||||
|
|
||||||
printf("Nand page per block %d, "
|
printf("Nand page per block %d, "
|
||||||
"Nand page size %d, "
|
"Nand page size %d, "
|
||||||
@ -100,23 +100,18 @@ int check_dump_cfg(struct hand *hand)
|
|||||||
"bad block offset in OOB %d, "
|
"bad block offset in OOB %d, "
|
||||||
"bad block page %d, "
|
"bad block page %d, "
|
||||||
"use %d plane mode\n",
|
"use %d plane mode\n",
|
||||||
hand->nand_ppb,
|
h->nand_ppb,
|
||||||
hand->nand_ps,
|
h->nand_ps,
|
||||||
hand->nand_eccpos,
|
h->nand_eccpos,
|
||||||
hand->nand_bbpos,
|
h->nand_bbpos,
|
||||||
hand->nand_bbpage,
|
h->nand_bbpage,
|
||||||
hand->nand_plane);
|
h->nand_plane);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int parse_configure(struct hand *hand, char * file_path)
|
int parse_configure(struct hand *h, char * file_path)
|
||||||
{
|
{
|
||||||
if (access(file_path, F_OK)) {
|
cfg_t *cfg;
|
||||||
fprintf(stderr, "Error - can't read configure file %s.\n",
|
|
||||||
file_path);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg_opt_t opts[] = {
|
cfg_opt_t opts[] = {
|
||||||
CFG_INT("BOUDRATE", 57600, CFGF_NONE),
|
CFG_INT("BOUDRATE", 57600, CFGF_NONE),
|
||||||
CFG_INT("EXTCLK", 0, CFGF_NONE),
|
CFG_INT("EXTCLK", 0, CFGF_NONE),
|
||||||
@ -153,58 +148,63 @@ int parse_configure(struct hand *hand, char * file_path)
|
|||||||
CFG_END()
|
CFG_END()
|
||||||
};
|
};
|
||||||
|
|
||||||
cfg_t *cfg;
|
if (access(file_path, F_OK)) {
|
||||||
|
fprintf(stderr, "Error - can't read configure file %s.\n",
|
||||||
|
file_path);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
cfg = cfg_init(opts, 0);
|
cfg = cfg_init(opts, 0);
|
||||||
if (cfg_parse(cfg, file_path) == CFG_PARSE_ERROR)
|
if (cfg_parse(cfg, file_path) == CFG_PARSE_ERROR)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
hand->fw_args.boudrate = cfg_getint(cfg, "BOUDRATE");
|
h->fw_args.boudrate = cfg_getint(cfg, "BOUDRATE");
|
||||||
hand->fw_args.ext_clk = cfg_getint(cfg, "EXTCLK");
|
h->fw_args.ext_clk = cfg_getint(cfg, "EXTCLK");
|
||||||
hand->fw_args.cpu_speed = cfg_getint(cfg, "CPUSPEED");
|
h->fw_args.cpu_speed = cfg_getint(cfg, "CPUSPEED");
|
||||||
hand->fw_args.phm_div = cfg_getint(cfg, "PHMDIV");
|
h->fw_args.phm_div = cfg_getint(cfg, "PHMDIV");
|
||||||
hand->fw_args.use_uart = cfg_getint(cfg, "USEUART");
|
h->fw_args.use_uart = cfg_getint(cfg, "USEUART");
|
||||||
|
|
||||||
hand->fw_args.bus_width = cfg_getint(cfg, "BUSWIDTH");
|
h->fw_args.bus_width = cfg_getint(cfg, "BUSWIDTH");
|
||||||
hand->fw_args.bank_num = cfg_getint(cfg, "BANKS");
|
h->fw_args.bank_num = cfg_getint(cfg, "BANKS");
|
||||||
hand->fw_args.row_addr = cfg_getint(cfg, "ROWADDR");
|
h->fw_args.row_addr = cfg_getint(cfg, "ROWADDR");
|
||||||
hand->fw_args.col_addr = cfg_getint(cfg, "COLADDR");
|
h->fw_args.col_addr = cfg_getint(cfg, "COLADDR");
|
||||||
|
|
||||||
hand->fw_args.is_mobile = cfg_getint(cfg, "ISMOBILE");
|
h->fw_args.is_mobile = cfg_getint(cfg, "ISMOBILE");
|
||||||
hand->fw_args.is_busshare = cfg_getint(cfg, "ISBUSSHARE");
|
h->fw_args.is_busshare = cfg_getint(cfg, "ISBUSSHARE");
|
||||||
hand->fw_args.debug_ops = cfg_getint(cfg, "DEBUGOPS");
|
h->fw_args.debug_ops = cfg_getint(cfg, "DEBUGOPS");
|
||||||
hand->fw_args.pin_num = cfg_getint(cfg, "PINNUM");
|
h->fw_args.pin_num = cfg_getint(cfg, "PINNUM");
|
||||||
hand->fw_args.start = cfg_getint(cfg, "START");
|
h->fw_args.start = cfg_getint(cfg, "START");
|
||||||
hand->fw_args.size = cfg_getint(cfg, "SIZE");
|
h->fw_args.size = cfg_getint(cfg, "SIZE");
|
||||||
|
|
||||||
hand->nand_bw = cfg_getint(cfg, "NAND_BUSWIDTH");
|
h->nand_bw = cfg_getint(cfg, "NAND_BUSWIDTH");
|
||||||
hand->nand_rc = cfg_getint(cfg, "NAND_ROWCYCLES");
|
h->nand_rc = cfg_getint(cfg, "NAND_ROWCYCLES");
|
||||||
hand->nand_ps = cfg_getint(cfg, "NAND_PAGESIZE");
|
h->nand_ps = cfg_getint(cfg, "NAND_PAGESIZE");
|
||||||
hand->nand_ppb = cfg_getint(cfg, "NAND_PAGEPERBLOCK");
|
h->nand_ppb = cfg_getint(cfg, "NAND_PAGEPERBLOCK");
|
||||||
hand->nand_force_erase = cfg_getint(cfg, "NAND_FORCEERASE");
|
h->nand_force_erase = cfg_getint(cfg, "NAND_FORCEERASE");
|
||||||
hand->nand_os = cfg_getint(cfg, "NAND_OOBSIZE");
|
h->nand_os = cfg_getint(cfg, "NAND_OOBSIZE");
|
||||||
hand->nand_eccpos = cfg_getint(cfg, "NAND_ECCPOS");
|
h->nand_eccpos = cfg_getint(cfg, "NAND_ECCPOS");
|
||||||
hand->nand_bbpos = cfg_getint(cfg, "NAND_BADBLOCKPOS");
|
h->nand_bbpos = cfg_getint(cfg, "NAND_BADBLOCKPOS");
|
||||||
hand->nand_bbpage = cfg_getint(cfg, "NAND_BADBLOCKPAGE");
|
h->nand_bbpage = cfg_getint(cfg, "NAND_BADBLOCKPAGE");
|
||||||
hand->nand_plane = cfg_getint(cfg, "NAND_PLANENUM");
|
h->nand_plane = cfg_getint(cfg, "NAND_PLANENUM");
|
||||||
hand->nand_bchbit = cfg_getint(cfg, "NAND_BCHBIT");
|
h->nand_bchbit = cfg_getint(cfg, "NAND_BCHBIT");
|
||||||
hand->nand_wppin = cfg_getint(cfg, "NAND_WPPIN");
|
h->nand_wppin = cfg_getint(cfg, "NAND_WPPIN");
|
||||||
hand->nand_bpc = cfg_getint(cfg, "NAND_BLOCKPERCHIP");
|
h->nand_bpc = cfg_getint(cfg, "NAND_BLOCKPERCHIP");
|
||||||
|
|
||||||
cfg_free(cfg);
|
cfg_free(cfg);
|
||||||
|
|
||||||
if (hand->fw_args.bus_width == 32)
|
if (h->fw_args.bus_width == 32)
|
||||||
hand->fw_args.bus_width = 0;
|
h->fw_args.bus_width = 0;
|
||||||
else
|
else
|
||||||
hand->fw_args.bus_width = 1;
|
h->fw_args.bus_width = 1;
|
||||||
hand->fw_args.bank_num = hand->fw_args.bank_num / 4;
|
h->fw_args.bank_num = h->fw_args.bank_num / 4;
|
||||||
hand->fw_args.cpu_speed = hand->fw_args.cpu_speed / hand->fw_args.ext_clk;
|
h->fw_args.cpu_speed = h->fw_args.cpu_speed / h->fw_args.ext_clk;
|
||||||
|
|
||||||
total_size = (unsigned int)
|
total_size = (unsigned int)
|
||||||
(2 << (hand->fw_args.row_addr + hand->fw_args.col_addr - 1)) * 2
|
(2 << (h->fw_args.row_addr + h->fw_args.col_addr - 1)) * 2
|
||||||
* (hand->fw_args.bank_num + 1) * 2
|
* (h->fw_args.bank_num + 1) * 2
|
||||||
* (2 - hand->fw_args.bus_width);
|
* (2 - h->fw_args.bus_width);
|
||||||
|
|
||||||
if (check_dump_cfg(hand) < 1)
|
if (check_dump_cfg(h) < 1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#define __INGENIC_CFG_H__
|
#define __INGENIC_CFG_H__
|
||||||
|
|
||||||
#include "usb_boot_defines.h"
|
#include "usb_boot_defines.h"
|
||||||
|
#include "ingenic_usb.h"
|
||||||
|
|
||||||
int hand_init_def(struct hand *hand);
|
int hand_init_def(struct hand *hand);
|
||||||
int check_dump_cfg(struct hand *hand);
|
int check_dump_cfg(struct hand *hand);
|
||||||
|
@ -26,22 +26,22 @@
|
|||||||
|
|
||||||
extern unsigned int total_size;
|
extern unsigned int total_size;
|
||||||
|
|
||||||
static int get_ingenic_device(struct ingenic_dev *ingenic_dev)
|
static int get_ingenic_device(struct ingenic_dev *id)
|
||||||
{
|
{
|
||||||
struct usb_bus *usb_busses, *usb_bus;
|
struct usb_bus *ub, *usb_bus;
|
||||||
struct usb_device *usb_dev;
|
struct usb_device *usb_dev;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
usb_busses = usb_get_busses();
|
ub = usb_get_busses();
|
||||||
|
|
||||||
for (usb_bus = usb_busses; usb_bus != NULL; usb_bus = usb_bus->next) {
|
for (usb_bus = ub; usb_bus != NULL; usb_bus = usb_bus->next) {
|
||||||
for (usb_dev = usb_bus->devices; usb_dev != NULL;
|
for (usb_dev = usb_bus->devices; usb_dev != NULL;
|
||||||
usb_dev = usb_dev->next) {
|
usb_dev = usb_dev->next) {
|
||||||
|
|
||||||
if ((usb_dev->descriptor.idVendor == VENDOR_ID) &&
|
if ((usb_dev->descriptor.idVendor == VENDOR_ID) &&
|
||||||
(usb_dev->descriptor.idProduct == PRODUCT_ID_4740 ||
|
(usb_dev->descriptor.idProduct == PRODUCT_ID_4740 ||
|
||||||
usb_dev->descriptor.idProduct == PRODUCT_ID_4760)) {
|
usb_dev->descriptor.idProduct == PRODUCT_ID_4760)) {
|
||||||
ingenic_dev->usb_dev = usb_dev;
|
id->usb_dev = usb_dev;
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ static int get_ingenic_device(struct ingenic_dev *ingenic_dev)
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_ingenic_interface(struct ingenic_dev *ingenic_dev)
|
static int get_ingenic_interface(struct ingenic_dev *id)
|
||||||
{
|
{
|
||||||
struct usb_config_descriptor *usb_config_desc;
|
struct usb_config_descriptor *usb_config_desc;
|
||||||
struct usb_interface_descriptor *usb_if_desc;
|
struct usb_interface_descriptor *usb_if_desc;
|
||||||
@ -59,9 +59,9 @@ static int get_ingenic_interface(struct ingenic_dev *ingenic_dev)
|
|||||||
int config_index, if_index, alt_index;
|
int config_index, if_index, alt_index;
|
||||||
|
|
||||||
for (config_index = 0;
|
for (config_index = 0;
|
||||||
config_index < ingenic_dev->usb_dev->descriptor.bNumConfigurations;
|
config_index < id->usb_dev->descriptor.bNumConfigurations;
|
||||||
config_index++) {
|
config_index++) {
|
||||||
usb_config_desc = &ingenic_dev->usb_dev->config[config_index];
|
usb_config_desc = &id->usb_dev->config[config_index];
|
||||||
|
|
||||||
if (!usb_config_desc)
|
if (!usb_config_desc)
|
||||||
return 0;
|
return 0;
|
||||||
@ -82,7 +82,7 @@ static int get_ingenic_interface(struct ingenic_dev *ingenic_dev)
|
|||||||
|
|
||||||
if ((usb_if_desc->bInterfaceClass == 0xff) &&
|
if ((usb_if_desc->bInterfaceClass == 0xff) &&
|
||||||
(usb_if_desc->bInterfaceSubClass == 0)) {
|
(usb_if_desc->bInterfaceSubClass == 0)) {
|
||||||
ingenic_dev->interface =
|
id->interface =
|
||||||
usb_if_desc->bInterfaceNumber;
|
usb_if_desc->bInterfaceNumber;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -93,18 +93,18 @@ static int get_ingenic_interface(struct ingenic_dev *ingenic_dev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_ingenic_init(struct ingenic_dev *ingenic_dev)
|
int usb_ingenic_init(struct ingenic_dev *id)
|
||||||
{
|
{
|
||||||
int num_ingenic, status = -1;
|
int num_ingenic, status = -1;
|
||||||
|
|
||||||
memset(ingenic_dev, 0, sizeof(struct ingenic_dev));
|
memset(id, 0, sizeof(struct ingenic_dev));
|
||||||
|
|
||||||
usb_init();
|
usb_init();
|
||||||
/* usb_set_debug(255); */
|
/* usb_set_debug(255); */
|
||||||
usb_find_busses();
|
usb_find_busses();
|
||||||
usb_find_devices();
|
usb_find_devices();
|
||||||
|
|
||||||
num_ingenic = get_ingenic_device(ingenic_dev);
|
num_ingenic = get_ingenic_device(id);
|
||||||
|
|
||||||
if (num_ingenic == 0) {
|
if (num_ingenic == 0) {
|
||||||
fprintf(stderr, "Error - no XBurst device found\n");
|
fprintf(stderr, "Error - no XBurst device found\n");
|
||||||
@ -117,19 +117,19 @@ int usb_ingenic_init(struct ingenic_dev *ingenic_dev)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ingenic_dev->usb_handle = usb_open(ingenic_dev->usb_dev);
|
id->usb_handle = usb_open(id->usb_dev);
|
||||||
if (!ingenic_dev->usb_handle) {
|
if (!id->usb_handle) {
|
||||||
fprintf(stderr, "Error - can't open XBurst device: %s\n",
|
fprintf(stderr, "Error - can't open XBurst device: %s\n",
|
||||||
usb_strerror());
|
usb_strerror());
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (get_ingenic_interface(ingenic_dev) < 1) {
|
if (get_ingenic_interface(id) < 1) {
|
||||||
fprintf(stderr, "Error - can't find XBurst interface\n");
|
fprintf(stderr, "Error - can't find XBurst interface\n");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usb_claim_interface(ingenic_dev->usb_handle, ingenic_dev->interface)
|
if (usb_claim_interface(id->usb_handle, id->interface)
|
||||||
< 0) {
|
< 0) {
|
||||||
fprintf(stderr, "Error - can't claim XBurst interface: %s\n",
|
fprintf(stderr, "Error - can't claim XBurst interface: %s\n",
|
||||||
usb_strerror());
|
usb_strerror());
|
||||||
@ -142,47 +142,47 @@ out:
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_get_ingenic_cpu(struct ingenic_dev *ingenic_dev)
|
int usb_get_ingenic_cpu(struct ingenic_dev *id)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
memset(&ingenic_dev->cpu_info_buff, 0,
|
memset(&id->cpu_info_buff, 0,
|
||||||
ARRAY_SIZE(ingenic_dev->cpu_info_buff));
|
ARRAY_SIZE(id->cpu_info_buff));
|
||||||
|
|
||||||
sleep(1);
|
sleep(1);
|
||||||
status = usb_control_msg(ingenic_dev->usb_handle,
|
status = usb_control_msg(id->usb_handle,
|
||||||
/* bmRequestType */ USB_ENDPOINT_IN | USB_TYPE_VENDOR |USB_RECIP_DEVICE,
|
/* bmRequestType */ USB_ENDPOINT_IN | USB_TYPE_VENDOR |USB_RECIP_DEVICE,
|
||||||
/* bRequest */ VR_GET_CPU_INFO,
|
/* bRequest */ VR_GET_CPU_INFO,
|
||||||
/* wValue */ 0,
|
/* wValue */ 0,
|
||||||
/* wIndex */ 0,
|
/* wIndex */ 0,
|
||||||
/* Data */ ingenic_dev->cpu_info_buff,
|
/* Data */ id->cpu_info_buff,
|
||||||
/* wLength */ 8,
|
/* wLength */ 8,
|
||||||
USB_TIMEOUT);
|
USB_TIMEOUT);
|
||||||
|
|
||||||
if (status != sizeof(ingenic_dev->cpu_info_buff) - 1 ) {
|
if (status != sizeof(id->cpu_info_buff) - 1 ) {
|
||||||
fprintf(stderr, "Error - "
|
fprintf(stderr, "Error - "
|
||||||
"can't retrieve XBurst CPU information: %i\n", status);
|
"can't retrieve XBurst CPU information: %i\n", status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
ingenic_dev->cpu_info_buff[8] = '\0';
|
id->cpu_info_buff[8] = '\0';
|
||||||
printf(" CPU data: %s\n", ingenic_dev->cpu_info_buff);
|
printf(" CPU data: %s\n", id->cpu_info_buff);
|
||||||
|
|
||||||
if (!strcmp(ingenic_dev->cpu_info_buff,"JZ4740V1")) return JZ4740V1;
|
if (!strcmp(id->cpu_info_buff,"JZ4740V1")) return JZ4740V1;
|
||||||
if (!strcmp(ingenic_dev->cpu_info_buff,"JZ4750V1")) return JZ4750V1;
|
if (!strcmp(id->cpu_info_buff,"JZ4750V1")) return JZ4750V1;
|
||||||
if (!strcmp(ingenic_dev->cpu_info_buff,"JZ4760V1")) return JZ4760V1;
|
if (!strcmp(id->cpu_info_buff,"JZ4760V1")) return JZ4760V1;
|
||||||
if (!strcmp(ingenic_dev->cpu_info_buff,"Boot4740")) return BOOT4740;
|
if (!strcmp(id->cpu_info_buff,"Boot4740")) return BOOT4740;
|
||||||
if (!strcmp(ingenic_dev->cpu_info_buff,"Boot4750")) return BOOT4750;
|
if (!strcmp(id->cpu_info_buff,"Boot4750")) return BOOT4750;
|
||||||
if (!strcmp(ingenic_dev->cpu_info_buff,"Boot4760")) return BOOT4760;
|
if (!strcmp(id->cpu_info_buff,"Boot4760")) return BOOT4760;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_ingenic_flush_cache(struct ingenic_dev *ingenic_dev)
|
int usb_ingenic_flush_cache(struct ingenic_dev *id)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
status = usb_control_msg(ingenic_dev->usb_handle,
|
status = usb_control_msg(id->usb_handle,
|
||||||
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||||
/* bRequest */ VR_FLUSH_CACHES,
|
/* bRequest */ VR_FLUSH_CACHES,
|
||||||
/* wValue */ 0,
|
/* wValue */ 0,
|
||||||
@ -199,11 +199,11 @@ int usb_ingenic_flush_cache(struct ingenic_dev *ingenic_dev)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_send_data_length_to_ingenic(struct ingenic_dev *ingenic_dev, int len)
|
int usb_send_data_length_to_ingenic(struct ingenic_dev *id, int len)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
/* tell the device the length of the file to be uploaded */
|
/* tell the device the length of the file to be uploaded */
|
||||||
status = usb_control_msg(ingenic_dev->usb_handle,
|
status = usb_control_msg(id->usb_handle,
|
||||||
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||||
/* bRequest */ VR_SET_DATA_LENGTH,
|
/* bRequest */ VR_SET_DATA_LENGTH,
|
||||||
/* wValue */ STAGE_ADDR_MSB(len),
|
/* wValue */ STAGE_ADDR_MSB(len),
|
||||||
@ -221,12 +221,12 @@ int usb_send_data_length_to_ingenic(struct ingenic_dev *ingenic_dev, int len)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_send_data_address_to_ingenic(struct ingenic_dev *ingenic_dev,
|
int usb_send_data_address_to_ingenic(struct ingenic_dev *id,
|
||||||
unsigned int stage_addr)
|
unsigned int stage_addr)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
/* tell the device the RAM address to store the file */
|
/* tell the device the RAM address to store the file */
|
||||||
status = usb_control_msg(ingenic_dev->usb_handle,
|
status = usb_control_msg(id->usb_handle,
|
||||||
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||||
/* bRequest */ VR_SET_DATA_ADDRESS,
|
/* bRequest */ VR_SET_DATA_ADDRESS,
|
||||||
/* wValue */ STAGE_ADDR_MSB(stage_addr),
|
/* wValue */ STAGE_ADDR_MSB(stage_addr),
|
||||||
@ -244,15 +244,15 @@ int usb_send_data_address_to_ingenic(struct ingenic_dev *ingenic_dev,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_send_data_to_ingenic(struct ingenic_dev *ingenic_dev)
|
int usb_send_data_to_ingenic(struct ingenic_dev *id)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
status = usb_bulk_write(ingenic_dev->usb_handle,
|
status = usb_bulk_write(id->usb_handle,
|
||||||
/* endpoint */ INGENIC_OUT_ENDPOINT,
|
/* endpoint */ INGENIC_OUT_ENDPOINT,
|
||||||
/* bulk data */ ingenic_dev->file_buff,
|
/* bulk data */ (char *)id->file_buff,
|
||||||
/* bulk data length */ ingenic_dev->file_len,
|
/* bulk data length */ id->file_len,
|
||||||
USB_TIMEOUT);
|
USB_TIMEOUT);
|
||||||
if (status < (int)ingenic_dev->file_len) {
|
if (status < (int)id->file_len) {
|
||||||
fprintf(stderr, "Error - "
|
fprintf(stderr, "Error - "
|
||||||
"can't send bulk data to Ingenic CPU: %i %s\n", status, usb_strerror());
|
"can't send bulk data to Ingenic CPU: %i %s\n", status, usb_strerror());
|
||||||
return -1;
|
return -1;
|
||||||
@ -261,13 +261,13 @@ int usb_send_data_to_ingenic(struct ingenic_dev *ingenic_dev)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_read_data_from_ingenic(struct ingenic_dev *ingenic_dev,
|
int usb_read_data_from_ingenic(struct ingenic_dev *id,
|
||||||
unsigned char *buff, unsigned int len)
|
unsigned char *buff, unsigned int len)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
status = usb_bulk_read(ingenic_dev->usb_handle,
|
status = usb_bulk_read(id->usb_handle,
|
||||||
/* endpoint */ INGENIC_IN_ENDPOINT,
|
/* endpoint */ INGENIC_IN_ENDPOINT,
|
||||||
/* bulk data */ buff,
|
/* bulk data */ (char *)buff,
|
||||||
/* bulk data length */ len,
|
/* bulk data length */ len,
|
||||||
USB_TIMEOUT);
|
USB_TIMEOUT);
|
||||||
|
|
||||||
@ -280,12 +280,12 @@ int usb_read_data_from_ingenic(struct ingenic_dev *ingenic_dev,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_ingenic_start(struct ingenic_dev *ingenic_dev, int rqst, int stage_addr)
|
int usb_ingenic_start(struct ingenic_dev *id, int rqst, unsigned int stage_addr)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
/* tell the device to start the uploaded device */
|
/* tell the device to start the uploaded device */
|
||||||
status = usb_control_msg(ingenic_dev->usb_handle,
|
status = usb_control_msg(id->usb_handle,
|
||||||
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||||
/* bRequest */ rqst,
|
/* bRequest */ rqst,
|
||||||
/* wValue */ STAGE_ADDR_MSB(stage_addr),
|
/* wValue */ STAGE_ADDR_MSB(stage_addr),
|
||||||
@ -302,53 +302,51 @@ int usb_ingenic_start(struct ingenic_dev *ingenic_dev, int rqst, int stage_addr)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_ingenic_upload(struct ingenic_dev *ingenic_dev, int stage)
|
int usb_ingenic_upload(struct ingenic_dev *id, int stage)
|
||||||
{
|
{
|
||||||
int status;
|
unsigned int stage_addr;
|
||||||
|
|
||||||
unsigned int stage2_addr;
|
unsigned int stage2_addr;
|
||||||
stage2_addr = total_size + 0x80000000;
|
|
||||||
stage2_addr -= CODE_SIZE;
|
|
||||||
|
|
||||||
unsigned int stage_addr = (stage == 1 ? 0x80002000 : stage2_addr);
|
|
||||||
int rqst = VR_PROGRAM_START1;
|
int rqst = VR_PROGRAM_START1;
|
||||||
|
|
||||||
usb_send_data_address_to_ingenic(ingenic_dev, stage_addr);
|
stage2_addr = 0x80000000 + total_size - CODE_SIZE;
|
||||||
|
stage_addr = (stage == 1 ? 0x80002000 : stage2_addr);
|
||||||
|
|
||||||
|
usb_send_data_address_to_ingenic(id, stage_addr);
|
||||||
printf(" Download stage %d program and execute at 0x%08x\n",
|
printf(" Download stage %d program and execute at 0x%08x\n",
|
||||||
stage, (stage_addr));
|
stage, (stage_addr));
|
||||||
usb_send_data_to_ingenic(ingenic_dev);
|
usb_send_data_to_ingenic(id);
|
||||||
|
|
||||||
if (stage == 2) {
|
if (stage == 2) {
|
||||||
if (usb_get_ingenic_cpu(ingenic_dev) < 1)
|
if (usb_get_ingenic_cpu(id) < 1)
|
||||||
return -1;
|
return -1;
|
||||||
usb_ingenic_flush_cache(ingenic_dev);
|
usb_ingenic_flush_cache(id);
|
||||||
rqst = VR_PROGRAM_START2;
|
rqst = VR_PROGRAM_START2;
|
||||||
}
|
}
|
||||||
|
|
||||||
usleep(100);
|
usleep(100);
|
||||||
if (usb_ingenic_start(ingenic_dev, rqst, stage_addr) < 1)
|
if (usb_ingenic_start(id, rqst, stage_addr) < 1)
|
||||||
return -1;
|
return -1;
|
||||||
usleep(100);
|
usleep(100);
|
||||||
if (usb_get_ingenic_cpu(ingenic_dev) < 1)
|
if (usb_get_ingenic_cpu(id) < 1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void usb_ingenic_cleanup(struct ingenic_dev *ingenic_dev)
|
void usb_ingenic_cleanup(struct ingenic_dev *id)
|
||||||
{
|
{
|
||||||
if ((ingenic_dev->usb_handle) && (ingenic_dev->interface))
|
if ((id->usb_handle) && (id->interface))
|
||||||
usb_release_interface(ingenic_dev->usb_handle,
|
usb_release_interface(id->usb_handle,
|
||||||
ingenic_dev->interface);
|
id->interface);
|
||||||
|
|
||||||
if (ingenic_dev->usb_handle)
|
if (id->usb_handle)
|
||||||
usb_close(ingenic_dev->usb_handle);
|
usb_close(id->usb_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_ingenic_nand_ops(struct ingenic_dev *ingenic_dev, int ops)
|
int usb_ingenic_nand_ops(struct ingenic_dev *id, int ops)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
status = usb_control_msg(ingenic_dev->usb_handle,
|
status = usb_control_msg(id->usb_handle,
|
||||||
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||||
/* bRequest */ VR_NAND_OPS,
|
/* bRequest */ VR_NAND_OPS,
|
||||||
/* wValue */ ops & 0xffff,
|
/* wValue */ ops & 0xffff,
|
||||||
@ -366,10 +364,10 @@ int usb_ingenic_nand_ops(struct ingenic_dev *ingenic_dev, int ops)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_ingenic_configration(struct ingenic_dev *ingenic_dev, int ops)
|
int usb_ingenic_configration(struct ingenic_dev *id, int ops)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
status = usb_control_msg(ingenic_dev->usb_handle,
|
status = usb_control_msg(id->usb_handle,
|
||||||
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||||
/* bRequest */ VR_CONFIGRATION,
|
/* bRequest */ VR_CONFIGRATION,
|
||||||
/* wValue */ ops,
|
/* wValue */ ops,
|
||||||
@ -387,10 +385,10 @@ int usb_ingenic_configration(struct ingenic_dev *ingenic_dev, int ops)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_ingenic_sdram_ops(struct ingenic_dev *ingenic_dev, int ops)
|
int usb_ingenic_sdram_ops(struct ingenic_dev *id, int ops)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
status = usb_control_msg(ingenic_dev->usb_handle,
|
status = usb_control_msg(id->usb_handle,
|
||||||
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||||
/* bRequest */ VR_SDRAM_OPS,
|
/* bRequest */ VR_SDRAM_OPS,
|
||||||
/* wValue */ ops,
|
/* wValue */ ops,
|
||||||
@ -408,10 +406,10 @@ int usb_ingenic_sdram_ops(struct ingenic_dev *ingenic_dev, int ops)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_ingenic_reset(struct ingenic_dev *ingenic_dev, int ops)
|
int usb_ingenic_reset(struct ingenic_dev *id, int ops)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
status = usb_control_msg(ingenic_dev->usb_handle,
|
status = usb_control_msg(id->usb_handle,
|
||||||
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||||
/* bRequest */ VR_RESET,
|
/* bRequest */ VR_RESET,
|
||||||
/* wValue */ ops,
|
/* wValue */ ops,
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#define __INGENIC_USB_H__
|
#define __INGENIC_USB_H__
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include "cmd.h"
|
||||||
|
|
||||||
#define INGENIC_OUT_ENDPOINT 0x01
|
#define INGENIC_OUT_ENDPOINT 0x01
|
||||||
#define INGENIC_IN_ENDPOINT 0x81
|
#define INGENIC_IN_ENDPOINT 0x81
|
||||||
@ -50,21 +51,24 @@ struct ingenic_dev {
|
|||||||
struct usb_dev_handle *usb_handle;
|
struct usb_dev_handle *usb_handle;
|
||||||
uint8_t interface;
|
uint8_t interface;
|
||||||
char cpu_info_buff[9];
|
char cpu_info_buff[9];
|
||||||
char *file_buff;
|
unsigned char *file_buff;
|
||||||
unsigned int file_len;
|
unsigned int file_len;
|
||||||
};
|
};
|
||||||
|
|
||||||
int usb_ingenic_init(struct ingenic_dev *ingenic_dev);
|
int usb_ingenic_init(struct ingenic_dev *id);
|
||||||
int usb_get_ingenic_cpu(struct ingenic_dev *ingenic_dev);
|
int usb_get_ingenic_cpu(struct ingenic_dev *id);
|
||||||
int usb_ingenic_upload(struct ingenic_dev *ingenic_dev, int stage);
|
int usb_ingenic_upload(struct ingenic_dev *id, int stage);
|
||||||
void usb_ingenic_cleanup(struct ingenic_dev *ingenic_dev);
|
void usb_ingenic_cleanup(struct ingenic_dev *id);
|
||||||
int usb_send_data_address_to_ingenic(struct ingenic_dev *ingenic_dev,
|
int usb_send_data_address_to_ingenic(struct ingenic_dev *id,
|
||||||
unsigned int stage_addr);
|
unsigned int stage_addr);
|
||||||
int usb_send_data_to_ingenic(struct ingenic_dev *ingenic_dev);
|
int usb_send_data_to_ingenic(struct ingenic_dev *id);
|
||||||
int usb_send_data_length_to_ingenic(struct ingenic_dev *ingenic_dev,
|
int usb_send_data_length_to_ingenic(struct ingenic_dev *id,
|
||||||
int len);
|
int len);
|
||||||
int usb_ingenic_nand_ops(struct ingenic_dev *ingenic_dev, int ops);
|
int usb_ingenic_nand_ops(struct ingenic_dev *id, int ops);
|
||||||
int usb_read_data_from_ingenic(struct ingenic_dev *ingenic_dev,unsigned char *buff, unsigned int len);
|
int usb_ingenic_sdram_ops(struct ingenic_dev *id, int ops);
|
||||||
int usb_ingenic_reset(struct ingenic_dev *ingenic_dev, int ops);
|
int usb_read_data_from_ingenic(struct ingenic_dev *id, unsigned char *buff, unsigned int len);
|
||||||
|
int usb_ingenic_reset(struct ingenic_dev *id, int ops);
|
||||||
|
int usb_ingenic_start(struct ingenic_dev *id, int rqst, unsigned int stage_addr);
|
||||||
|
int usb_ingenic_configration(struct ingenic_dev *id, int ops);
|
||||||
|
|
||||||
#endif /* __INGENIC_USB_H__ */
|
#endif /* __INGENIC_USB_H__ */
|
||||||
|
@ -125,7 +125,7 @@ int main(int argc, char **argv)
|
|||||||
int i, loop = 0;
|
int i, loop = 0;
|
||||||
|
|
||||||
sub_cmd[loop++] = strtok(cmdpt, ";");
|
sub_cmd[loop++] = strtok(cmdpt, ";");
|
||||||
while (sub_cmd[loop++] = strtok(NULL, ";"))
|
while ((sub_cmd[loop++] = strtok(NULL, ";")) != NULL)
|
||||||
if (loop >= MAX_COMMANDS) {
|
if (loop >= MAX_COMMANDS) {
|
||||||
printf(" -c only support 10 commands\n");
|
printf(" -c only support 10 commands\n");
|
||||||
break;
|
break;
|
||||||
|
@ -83,7 +83,7 @@ enum SDRAM_OPS_TYPE {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum DATA_STRUCTURE_OB {
|
enum DATA_STRUCTURE_OB {
|
||||||
DS_flash_info ,
|
DS_flash_info = 0,
|
||||||
DS_hand
|
DS_hand
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
AM_CFLAGS = -pedantic -Wall -W -std=gnu99 -DDATADIR=\"$(pkgdatadir)\"
|
AM_CFLAGS = -Wall -W -std=gnu99 -DDATADIR=\"$(pkgdatadir)\"
|
||||||
|
|
||||||
bin_PROGRAMS = xbboot
|
bin_PROGRAMS = xbboot
|
||||||
xbboot_SOURCES = host_main.c
|
xbboot_SOURCES = host_main.c
|
||||||
|
@ -70,6 +70,7 @@ int main(int argc, char** argv)
|
|||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xburst_h = NULL;
|
||||||
if (!strcmp(argv[1], "-u") || !strcmp(argv[1], "--upload")) {
|
if (!strcmp(argv[1], "-u") || !strcmp(argv[1], "--upload")) {
|
||||||
if (argc != 4) {
|
if (argc != 4) {
|
||||||
show_help();
|
show_help();
|
||||||
|
Loading…
Reference in New Issue
Block a user