1
0
mirror of git://projects.qi-hardware.com/xburst-tools.git synced 2024-11-22 18:54:39 +02:00

Merge branch 'master' of git@github.com:xiangfu/inflash

This commit is contained in:
Wolfgang Spraul 2009-06-29 09:49:21 +08:00
commit 943582d4fb
6 changed files with 249 additions and 87 deletions

View File

@ -9,10 +9,11 @@ BUILT_SOURCES = inflash_version.h
bin_PROGRAMS = inflash
inflash_SOURCES = cmd.c command_line.c ingenic_cfg.c \
ingenic_usb.c main.c
prefix = /usr
prefix = /usr
datadir = /usr/share/inflash
data_DATA = ../xburst_stage1/xburst_stage1.bin ../xburst_stage2/xburst_stage2.bin \
data_DATA = ../xburst_stage1/xburst_stage1.bin \
../xburst_stage2/xburst_stage2.bin \
inflash.cfg
EXTRA_DIST = $(datadir)

View File

@ -27,9 +27,10 @@ extern char com_argv[MAX_ARGC][MAX_COMMAND_LENGTH];
struct ingenic_dev ingenic_dev;
struct hand hand;
struct sdram_in sdram_in;
struct nand_in nand_in;
static struct nand_out nand_out;
unsigned int total_size;
unsigned char code_buf[4 * 512 * 1024];
unsigned char check_buf[4 * 512 * 1024];
@ -137,7 +138,7 @@ int boot(char *stage1_path, char *stage2_path){
}
if (status) {
printf(" Already booted.");
printf(" Already booted.\n");
return 1;
} else {
printf(" CPU not yet booted, now booting...\n");
@ -174,7 +175,7 @@ int error_check(unsigned char *org,unsigned char * obj,unsigned int size)
for (i = 0; i < size; i++) {
if (org[i] != obj[i]) {
unsigned int s = (i < 8) ? i : i - 8; // start_dump
printf("FAIL at off %d, wrote %x, read %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 %02x %02x %02x %02x %02x %02x %02x %02x\n", s,
org[s], org[s+1], org[s+2], org[s+3], org[s+4], org[s+5], org[s+6], org[s+7],
org[s+8], org[s+9], org[s+10], org[s+11], org[s+12], org[s+13], org[s+14], org[s+15]);
@ -586,9 +587,8 @@ int nand_query(void)
unsigned char csn;
if (com_argc < 3) {
printf(" Usage:\n");
printf(" nquery (1) (2) ");
printf(" (1):device index number\n"
printf(" Usage: nquery (1) (2)\n"
" (1):device index number\n"
" (2):flash index number\n");
return -1;
}
@ -633,14 +633,15 @@ int nand_read(int mode)
unsigned int start_addr, length, page_num;
unsigned char csn;
unsigned short temp = 0;
unsigned ram_addr = 0;
if (com_argc < 5) {
printf(" Usage:\n");
printf(" nread (1) (2) (3) (4) ");
printf(" 1:start page number\n"
printf(" Usage: nread (1) (2) (3) (4)\n"
" 1:start page number\n"
" 2:length in byte\n"
" 3:device index number\n"
" 4:flash index number \n");
" 4:flash index number\n"
" 5:start SDRAM address\n");
return -1;
}
init_nand_in();
@ -654,6 +655,10 @@ int nand_read(int mode)
nand_in.length= atoi(com_argv[2]);
nand_in.dev = atoi(com_argv[3]);
if (com_argc = 6) {
ram_addr = strtoul(com_argv[5], NULL, 0);
printf("==%s==", com_argv[5]);
}
start_addr = nand_in.start;
length = nand_in.length;
@ -674,9 +679,6 @@ int nand_read(int mode)
page_num = length / hand.nand_ps +1;
usb_send_data_address_to_ingenic(&ingenic_dev, start_addr);
usb_send_data_length_to_ingenic(&ingenic_dev, page_num);
switch(mode) {
case NAND_READ:
temp = ((NO_OOB<<12) & 0xf000) + ((csn<<4) & 0xff0) + NAND_READ;
@ -685,22 +687,33 @@ int nand_read(int mode)
temp = ((csn<<4) & 0xff0) + NAND_READ_OOB;
break;
case NAND_READ_RAW:
temp = ((NO_OOB<<12) & 0xf000) + ((csn<<4) & 0xff0) + NAND_READ_RAW;
temp = ((NO_OOB<<12) & 0xf000) + ((csn<<4) & 0xff0) +
NAND_READ_RAW;
break;
case NAND_READ_TO_RAM:
temp = ((NO_OOB<<12) & 0xf000) + ((csn<<4) & 0xff0) +
NAND_READ_TO_RAM;
printf(" Reading nand to RAM: 0x%x\n", ram_addr);
usb_ingenic_start(&ingenic_dev, VR_PROGRAM_START1, ram_addr);
break;
default:
printf(" unknow mode!\n");
return -1;
}
usb_send_data_address_to_ingenic(&ingenic_dev, start_addr);
usb_send_data_length_to_ingenic(&ingenic_dev, page_num);
usb_ingenic_nand_ops(&ingenic_dev, temp);
usb_read_data_from_ingenic(&ingenic_dev, nand_in.buf, page_num * hand.nand_ps);
for (j=0;j<length;j++)
{
if (j % 16 == 0) printf(" 0x%08x :\n",j);
for (j = 0; j < length; j++) {
if (j % 16 == 0)
printf("\n 0x%08x : ",j);
printf("%02x ",(nand_in.buf)[j]);
}
printf("\n");
usb_read_data_from_ingenic(&ingenic_dev, ret, 8);
printf(" Operation end position : %d \n",
@ -738,7 +751,7 @@ int debug_memory(int obj, unsigned int start, unsigned int size)
else
hand.fw_args.size = size;
printf(" Now test memory from %x to %x: \n",
printf(" Now test memory from 0x%x to 0x%x: \n",
start, start + hand.fw_args.size);
if (load_file(&ingenic_dev, STAGE1_FILE_PATH) < 1)
@ -749,7 +762,7 @@ int debug_memory(int obj, unsigned int start, unsigned int size)
usleep(100);
usb_read_data_from_ingenic(&ingenic_dev, buffer, 8);
if (buffer[0] != 0)
printf(" Test memory fail! Last error address is %x !\n",
printf(" Test memory fail! Last error address is 0x%x !\n",
buffer[0]);
else
printf(" Test memory pass!\n");
@ -802,3 +815,117 @@ int debug_gpio(int obj, unsigned char ops, unsigned char pin)
return 0;
}
int debug_go(void)
{
unsigned int addr,obj;
if (com_argc<3) {
printf(" Usage: go (1) (2) \n"
" 1:start SDRAM address\n"
" 2:device index number\n");
return 0;
}
addr = strtoul(com_argv[1], NULL, 0);
obj = atoi(com_argv[2]);
printf(" Executing No.%d device at address 0x%x\n", obj, addr);
if (usb_ingenic_start(&ingenic_dev, VR_PROGRAM_START2, addr) < 1)
return -1;
return 1;
}
int sdram_load(struct sdram_in *sdram_in)
{
if (usb_get_ingenic_cpu(&ingenic_dev) < 3) {
printf(" Device unboot! Boot it first!\n");
return -1;
}
if (sdram_in->length > (unsigned int) MAX_LOAD_SIZE) {
printf(" Image length too long!\n");
return -1;
}
ingenic_dev.file_buff = sdram_in->buf;
ingenic_dev.file_len = sdram_in->length;
usb_send_data_to_ingenic(&ingenic_dev);
usb_send_data_address_to_ingenic(&ingenic_dev, sdram_in->start);
usb_send_data_length_to_ingenic(&ingenic_dev, sdram_in->length);
usb_ingenic_sdram_ops(&ingenic_dev, sdram_in);
usb_read_data_from_ingenic(&ingenic_dev, ret, 8);
printf(" Load last address at 0x%x\n",
((ret[3]<<24)|(ret[2]<<16)|(ret[1]<<8)|(ret[0]<<0)));
return 1;
}
int sdram_load_file(struct sdram_in *sdram_in, char *file_path)
{
struct stat fstat;
unsigned int flen,m,j,offset,k;
int fd, status, res = -1;
status = stat(file_path, &fstat);
if (status < 0) {
fprintf(stderr, "Error - can't get file size from '%s': %s\n",
file_path, strerror(errno));
goto out;
}
flen = fstat.st_size;
fd = open(file_path, O_RDONLY);
if (fd < 0) {
fprintf(stderr, "Error - can't open file '%s': %s\n",
file_path, strerror(errno));
goto out;
}
m = flen / MAX_LOAD_SIZE;
j = flen % MAX_LOAD_SIZE;
offset = 0;
printf(" Total size to send in byte is :%d\n", flen);
printf(" Loading data to SDRAM :\n");
for (k = 0; k < m; k++) {
status = read(fd, sdram_in->buf, MAX_LOAD_SIZE);
if (status < MAX_LOAD_SIZE) {
fprintf(stderr, "Error - can't read file '%s': %s\n",
file_path, strerror(errno));
goto close;
}
sdram_in->length = MAX_LOAD_SIZE;
if (sdram_load(sdram_in) < 1)
goto close;
sdram_in->start += MAX_LOAD_SIZE;
if ( k % 60 == 0)
printf(" 0x%x \n", sdram_in->start);
}
if (j) {
if (j % 4 !=0)
j += 4 - (j % 4);
status = read(fd, sdram_in->buf, j);
if (status < j) {
fprintf(stderr, "Error - can't read file '%s': %s\n",
file_path, strerror(errno));
goto close;
}
sdram_in->length = j;
if (sdram_load(sdram_in) < 1)
goto close;
}
res = 1;
close:
close(fd);
out:
return res;
}

View File

@ -23,5 +23,6 @@ int nand_query(void);
int nand_erase(struct nand_in *nand_in);
int debug_memory(int obj, unsigned int start, unsigned int size);
int debug_gpio(int obj, unsigned char ops, unsigned char pin);
int debug_go(void);
#endif /* __CMD_H__ */

View File

@ -16,10 +16,11 @@
#include "inflash_version.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];
const char HEX_NUM[17]={'0','1','2','3','4','5','6','7','8','9',
'a','b','c','d','e','f',' '};
static const char COMMAND[][COMMAND_NUM]=
{
@ -83,23 +84,6 @@ static int handle_help(void)
return 1;
}
unsigned int hex2dec(char *s)
{
int i,L=(int)strlen(s),j;
unsigned int temp=0;
if (L>8) L=8;
for (i = 0; i < L; i++) {
for (j = 0; j < 16; j++)
if (s[i] == HEX_NUM[j])
break;
if (j == 16)
return 0;
temp = temp * 16 + j;
}
return temp;
}
static int handle_version(void)
{
printf(" USB Boot Software current version: %s\n", INFLASH_VERSION);
@ -110,9 +94,8 @@ static int handle_version(void)
int handle_nerase(void)
{
if (com_argc < 5) {
printf(" Usage:\n");
printf(" nerase (1) (2) (3) (4) ");
printf(" 1:start block number\n"
printf(" Usage: nerase (1) (2) (3) (4)\n"
" 1:start block number\n"
" 2:block length\n"
" 3:device index number\n"
" 4:flash chip index number\n");
@ -138,11 +121,9 @@ int handle_nerase(void)
int handle_nmark(void)
{
int i;
if (com_argc < 4) {
printf(" Usage:\n");
printf(" nerase (1) (2) (3) ");
printf(" 1:bad block number\n"
printf(" Usage: nerase (1) (2) (3)\n"
" 1:bad block number\n"
" 2:device index number\n"
" 3:flash chip index number\n");
return -1;
@ -167,22 +148,16 @@ int handle_memtest(void)
unsigned int start, size;
if (com_argc != 2 && com_argc != 4)
{
printf(" Usage:\n");
printf(" memtest (1) [2] [3] ");
printf(" 1:device index number\n"
printf(" Usage: memtest (1) [2] [3]\n"
" 1:device index number\n"
" 2:SDRAM start address\n"
" 3:test size\n");
return -1;
}
if (com_argc == 4) {
if (com_argv[2][0]=='0'&&com_argv[2][1]=='x')
start=hex2dec(&com_argv[2][2]);
else start=atol(com_argv[2]);
if (com_argv[3][0]=='0'&&com_argv[3][1]=='x')
size = hex2dec(&com_argv[3][2]);
else size = atol(com_argv[3]);
start = strtoul(com_argv[2], NULL, 0);
size = strtoul(com_argv[3], NULL, 0);
} else {
start = 0;
size = 0;
@ -194,8 +169,8 @@ int handle_memtest(void)
int handle_gpio(int mode)
{
if (com_argc < 3) {
printf(" Usage:\n"
" gpios (1) (2) "
printf(" Usage:"
" gpios (1) (2)\n"
" 1:GPIO pin number\n"
" 2:device index number\n");
return -1;
@ -205,6 +180,27 @@ int handle_gpio(int mode)
return 1;
}
int handle_load(void)
{
if (com_argc<4) {
printf(" Usage:"
" load (1) (2) (3) \n"
" 1:SDRAM start address\n"
" 2:image file name\n"
" 3:device index number\n");
return -1;
}
sdram_in.start=strtoul(com_argv[1], NULL, 0);
printf(" start:::::: 0x%x\n", sdram_in.start);
sdram_in.dev = atoi(com_argv[3]);
sdram_in.buf = code_buf;
sdram_load_file(&sdram_in, com_argv[2]);
return 1;
}
int command_interpret(char * com_buf)
{
char *buf = com_buf;
@ -273,10 +269,16 @@ int command_handle(char *buf)
case 13:
handle_version();
break;
case 14:
debug_go();
break;
case 16: /* exit */
printf(" exiting inflash software\n");
return -1; /* return -1 to break the main.c while
* then run usb_ingenic_cleanup*/
/*case 17:
nand_read(NAND_READ_TO_RAM); */
break;
case 18:
handle_gpio(2);
break;
@ -289,6 +291,9 @@ int command_handle(char *buf)
case 26:
handle_nmark();
break;
case 28:
handle_load();
break;
case 29:
handle_memtest();
break;

View File

@ -8,11 +8,11 @@
* 3 of the License, or (at your option) any later version.
*/
#include "ingenic_usb.h"
#include "usb_boot_defines.h"
#include <usb.h>
#include <stdio.h>
#include <string.h>
#include "usb_boot_defines.h"
#include "ingenic_usb.h"
extern unsigned int total_size;
@ -155,8 +155,7 @@ int usb_get_ingenic_cpu(struct ingenic_dev *ingenic_dev)
}
ingenic_dev->cpu_info_buff[8] = '\0';
printf(" CPU data: %s\n",
ingenic_dev->cpu_info_buff);
/* printf(" CPU data: %s\n", ingenic_dev->cpu_info_buff); */
if (!strcmp(ingenic_dev->cpu_info_buff,"JZ4740V1")) return 1;
if (!strcmp(ingenic_dev->cpu_info_buff,"JZ4750V1")) return 2;
@ -267,31 +266,14 @@ int usb_read_data_from_ingenic(struct ingenic_dev *ingenic_dev,
return 1;
}
int usb_ingenic_upload(struct ingenic_dev *ingenic_dev, int stage)
int usb_ingenic_start(struct ingenic_dev *ingenic_dev, int rqst, int stage_addr)
{
int status;
unsigned int stage2_addr;
stage2_addr = total_size + 0x80000000;
stage2_addr -= CODE_SIZE;
int stage_addr = (stage == 1 ? 0x80002000 : stage2_addr);
usb_send_data_address_to_ingenic(ingenic_dev, stage_addr);
printf(" Download stage %d program and execute at 0x%08x\n",
stage, (stage_addr));
usb_send_data_to_ingenic(ingenic_dev);
if (stage == 2) {
if (usb_get_ingenic_cpu(ingenic_dev) < 1)
return -1;
usb_ingenic_flush_cache(ingenic_dev);
}
/* tell the device to start the uploaded device */
status = usb_control_msg(ingenic_dev->usb_handle,
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
/* bRequest */ (stage == 1 ? VR_PROGRAM_START1 : VR_PROGRAM_START2),
/* bRequest */ rqst,
/* wValue */ STAGE_ADDR_MSB(stage_addr),
/* wIndex */ STAGE_ADDR_LSB(stage_addr),
/* Data */ 0,
@ -303,7 +285,34 @@ int usb_ingenic_upload(struct ingenic_dev *ingenic_dev, int stage)
"on the Ingenic device: %i\n", status);
return status;
}
return 1;
}
int usb_ingenic_upload(struct ingenic_dev *ingenic_dev, int stage)
{
int status;
unsigned int stage2_addr;
stage2_addr = total_size + 0x80000000;
stage2_addr -= CODE_SIZE;
int stage_addr = (stage == 1 ? 0x80002000 : stage2_addr);
int rqst = VR_PROGRAM_START1;
usb_send_data_address_to_ingenic(ingenic_dev, stage_addr);
printf(" Download stage %d program and execute at 0x%08x\n",
stage, (stage_addr));
usb_send_data_to_ingenic(ingenic_dev);
if (stage == 2) {
if (usb_get_ingenic_cpu(ingenic_dev) < 1)
return -1;
usb_ingenic_flush_cache(ingenic_dev);
rqst = VR_PROGRAM_START2;
}
if (usb_ingenic_start(ingenic_dev, rqst, stage_addr) < 1)
return -1;
if (usb_get_ingenic_cpu(ingenic_dev) < 1)
return -1;
@ -361,3 +370,24 @@ int usb_ingenic_configration(struct ingenic_dev *ingenic_dev, int ops)
return 1;
}
int usb_ingenic_sdram_ops(struct ingenic_dev *ingenic_dev, int ops)
{
int status;
status = usb_control_msg(ingenic_dev->usb_handle,
/* bmRequestType */ USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
/* bRequest */ VR_SDRAM_OPS,
/* wValue */ ops,
/* wIndex */ 0,
/* Data */ 0,
/* wLength */ 0,
USB_TIMEOUT);
if (status != 0) {
fprintf(stderr, "Error - "
"Device can't load file to sdram: %i\n", status);
return -1;
}
return 1;
}

View File

@ -10,7 +10,6 @@
#ifndef __USB_BOOT_DEFINES_H__
#define __USB_BOOT_DEFINES_H__
/* #define dprintf(x...) printf(x) */
#define SDRAM_SIZE ( 16 * 1024 * 1024 )
#define CODE_SIZE ( 4 * 1024 * 1024 )
/* #define START_ADDR ( 0x80000000 + SDRAM_SIZE - CODE_SIZE ) */
@ -20,9 +19,7 @@
#define NAND_SECTION_NUM 23
#define MAX_TRANSFER_SIZE 0x100000
#define MAX_LOAD_SIZE 0x3000
#define NAND_MAX_BYTE_NUM (Hand.nand_pn * Hand.nand_ps)
#define IOCTL_INBUF_SIZE 512
#define IOCTL_OUTBUF_SIZE 512
#define NAND_MAX_BYTE_NUM (hand.nand_pn * hand.nand_ps)
#define MAX_DEV_NUM 16
enum CPUTYPE {
@ -152,3 +149,4 @@ struct sdram_in {
};
#endif /* __USB_BOOT_DEFINES_H__ */