diff --git a/usbboot/src/cmd.c b/usbboot/src/cmd.c index e985556..f931196 100644 --- a/usbboot/src/cmd.c +++ b/usbboot/src/cmd.c @@ -222,12 +222,14 @@ int nand_program_check(struct nand_in *nand_in, unsigned int *start_page) { unsigned int i, page_num, cur_page = -1; + unsigned int start_addr; unsigned short temp; + int status = -1; printf(" Writing NAND page %d len %d...\n", nand_in->start, nand_in->length); if (nand_in->length > (unsigned int)MAX_TRANSFER_SIZE) { printf(" Buffer size too long!\n"); - return -1; + goto err; } #ifdef CONFIG_NAND_OUT @@ -237,15 +239,17 @@ int nand_program_check(struct nand_in *nand_in, (nand_out->status)[i] = 0; /* set all status to fail */ #endif - if (usb_get_ingenic_cpu(&ingenic_dev) < 3) { + int cpu = usb_get_ingenic_cpu(&ingenic_dev); + if (cpu != BOOT4740 && cpu != BOOT4750) { printf(" Device unboot! Boot it first!\n"); - return -1; + goto err; } + ingenic_dev.file_buff = nand_in->buf; ingenic_dev.file_len = nand_in->length; usb_send_data_to_ingenic(&ingenic_dev); for (i = 0; i < nand_in->max_chip; i++) { - if ((nand_in->cs_map)[i]==0) + if ((nand_in->cs_map)[i] == 0) continue; if (nand_in->option == NO_OOB) { page_num = nand_in->length / hand.nand_ps; @@ -259,50 +263,47 @@ int nand_program_check(struct nand_in *nand_in, } temp = ((nand_in->option << 12) & 0xf000) + ((i<<4) & 0xff0) + NAND_PROGRAM; - usb_send_data_address_to_ingenic(&ingenic_dev, nand_in->start); - usb_send_data_length_to_ingenic(&ingenic_dev, page_num); - usb_ingenic_nand_ops(&ingenic_dev, temp); + if (usb_send_data_address_to_ingenic(&ingenic_dev, nand_in->start) != 1) + goto err; + if (usb_send_data_length_to_ingenic(&ingenic_dev, page_num) != 1) + goto err; + if (usb_ingenic_nand_ops(&ingenic_dev, temp) != 1) + goto err; + if (usb_read_data_from_ingenic(&ingenic_dev, ret, 8) != 1) + goto err; - usb_read_data_from_ingenic(&ingenic_dev, ret, 8); printf(" Finish! (len %d start_page %d page_num %d)\n", nand_in->length, nand_in->start, page_num); - usb_send_data_address_to_ingenic(&ingenic_dev, nand_in->start); /* Read back to check! */ + usb_send_data_address_to_ingenic(&ingenic_dev, nand_in->start); usb_send_data_length_to_ingenic(&ingenic_dev, page_num); switch (nand_in->option) { case OOB_ECC: temp = ((OOB_ECC << 12) & 0xf000) + ((i << 4) & 0xff0) + NAND_READ; - usb_ingenic_nand_ops(&ingenic_dev, temp); - printf(" Checking %d bytes...", nand_in->length); - usb_read_data_from_ingenic(&ingenic_dev, check_buf, - page_num * (hand.nand_ps + hand.nand_os)); - usb_read_data_from_ingenic(&ingenic_dev, ret, 8); + start_addr = page_num * (hand.nand_ps + hand.nand_os); break; case OOB_NO_ECC: /* do not support data verify */ temp = ((OOB_NO_ECC << 12) & 0xf000) + ((i << 4) & 0xff0) + NAND_READ; - usb_ingenic_nand_ops(&ingenic_dev, temp); - printf(" Checking %d bytes...", nand_in->length); - usb_read_data_from_ingenic(&ingenic_dev, check_buf, - page_num * (hand.nand_ps + hand.nand_os)); - usb_read_data_from_ingenic(&ingenic_dev, ret, 8); + start_addr = page_num * (hand.nand_ps + hand.nand_os); break; case NO_OOB: temp = ((NO_OOB << 12) & 0xf000) + ((i << 4) & 0xff0) + NAND_READ; - usb_ingenic_nand_ops(&ingenic_dev, temp); - printf(" Checking %d bytes...", nand_in->length); - usb_read_data_from_ingenic(&ingenic_dev, check_buf, - page_num * hand.nand_ps); - usb_read_data_from_ingenic(&ingenic_dev, ret, 8); + start_addr = page_num * hand.nand_ps; break; default: ; } + printf(" Checking %d bytes...", nand_in->length); + 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, ret, 8); + cur_page = (ret[3] << 24) | (ret[2] << 16) | (ret[1] << 8) | (ret[0] << 0); @@ -329,11 +330,14 @@ int nand_program_check(struct nand_in *nand_in, nand_markbad(&bad); } - printf(" End at Page: %d\n",cur_page); + printf(" End at Page: %d\n", cur_page); } *start_page = cur_page; - return 0; + + status = 1; +err: + return status; } int nand_erase(struct nand_in *nand_in) @@ -551,6 +555,7 @@ int init_nand_in(void) int nand_prog(void) { + int status = -1; char *image_file; char *help = " Usage: nprog (1) (2) (3) (4) (5)\n" " (1)\tstart page number\n" @@ -595,7 +600,9 @@ int nand_prog(void) printf(" %d", (nand_out.status)[i]); #endif - return 1; + status = 1; +err: + return status; } int nand_query(void) diff --git a/usbboot/src/ingenic_usb.c b/usbboot/src/ingenic_usb.c index 6b622cd..e74971d 100644 --- a/usbboot/src/ingenic_usb.c +++ b/usbboot/src/ingenic_usb.c @@ -166,12 +166,12 @@ 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); - if (!strcmp(ingenic_dev->cpu_info_buff,"JZ4740V1")) return 1; - if (!strcmp(ingenic_dev->cpu_info_buff,"JZ4750V1")) return 2; - if (!strcmp(ingenic_dev->cpu_info_buff,"Boot4740")) return 3; - if (!strcmp(ingenic_dev->cpu_info_buff,"Boot4750")) return 4; + if (!strcmp(ingenic_dev->cpu_info_buff,"JZ4740V1")) return JZ4740V1; + if (!strcmp(ingenic_dev->cpu_info_buff,"JZ4750V1")) return JZ4750V1; + if (!strcmp(ingenic_dev->cpu_info_buff,"Boot4740")) return BOOT4740; + if (!strcmp(ingenic_dev->cpu_info_buff,"Boot4750")) return BOOT4750; - return 0; + return -1; } int usb_ingenic_flush_cache(struct ingenic_dev *ingenic_dev) diff --git a/usbboot/src/ingenic_usb.h b/usbboot/src/ingenic_usb.h index 9af7b72..76444c5 100644 --- a/usbboot/src/ingenic_usb.h +++ b/usbboot/src/ingenic_usb.h @@ -37,11 +37,16 @@ #define VR_CONFIGRATION 0x09 #define VR_GET_NUM 0x0a +#define JZ4740V1 1 +#define JZ4750V1 2 +#define BOOT4740 3 +#define BOOT4750 4 + #define STAGE_ADDR_MSB(addr) ((addr) >> 16) #define STAGE_ADDR_LSB(addr) ((addr) & 0xffff) -#define USB_PACKET_SIZE 512 -#define USB_TIMEOUT 5000 +#define USB_PACKET_SIZE 512 +#define USB_TIMEOUT 5000 #define VENDOR_ID 0x601a #define PRODUCT_ID 0x4740 @@ -73,4 +78,3 @@ int usb_ingenic_nand_ops(struct ingenic_dev *ingenic_dev, int ops); int usb_read_data_from_ingenic(struct ingenic_dev *ingenic_dev,unsigned char *buff, unsigned int len); #endif /* __INGENIC_USB_H__ */ - diff --git a/usbboot/xburst_stage2/boothandler.c b/usbboot/xburst_stage2/boothandler.c index b166b6a..16d615c 100644 --- a/usbboot/xburst_stage2/boothandler.c +++ b/usbboot/xburst_stage2/boothandler.c @@ -83,13 +83,6 @@ void config_hand() Hand.nand_eccpos=hand_p->nand_eccpos; Hand.nand_bbpos=hand_p->nand_bbpos; Hand.nand_bbpage=hand_p->nand_bbpage; -// memcpy( &Hand.fw_args, (unsigned char *)(start_addr + 0x8), 32 ); - -// serial_putc(Hand.nand_eccpos + 48); -// serial_putc(Hand.nand_bbpos + 48); -// serial_putc(Hand.nand_bbpage + 48); - /* dprintf("\n Hand : bw %d rc %d ps %d ppb %d erase %d pn %d os %d", */ - /* Hand.nand_bw,Hand.nand_rc,Hand.nand_ps,Hand.nand_ppb,Hand.nand_force_erase,Hand.nand_pn,Hand.nand_os); */ serial_put_hex(Hand.fw_args.cpu_id); serial_put_hex(Hand.fw_args.ext_clk); #endif @@ -98,11 +91,12 @@ void config_hand() int GET_CUP_INFO_Handle() { char temp1[8]="Boot4740",temp2[8]="Boot4750"; - dprintf("\n GET_CPU_INFO!"); - if ( Hand.fw_args.cpu_id == 0x4740 ) - HW_SendPKT(0,temp1,8); + dprintf("\n GET_CPU_INFO:\t"); + serial_put_hex(Hand.fw_args.cpu_id); + if (Hand.fw_args.cpu_id == 0x4740) + HW_SendPKT(0, temp1, 8); else - HW_SendPKT(0,temp2,8); + HW_SendPKT(0, temp2, 8); udc_state = IDLE; return ERR_OK; } @@ -111,7 +105,7 @@ int SET_DATA_ADDERSS_Handle(u8 *buf) { USB_DeviceRequest *dreq = (USB_DeviceRequest *)buf; start_addr=(((u32)dreq->wValue)<<16)+(u32)dreq->wIndex; - dprintf("\n SET ADDRESS:"); + dprintf("\n SET ADDRESS:\t"); serial_put_hex(start_addr); return ERR_OK; } @@ -120,7 +114,7 @@ int SET_DATA_LENGTH_Handle(u8 *buf) { USB_DeviceRequest *dreq = (USB_DeviceRequest *)buf; ops_length=(((u32)dreq->wValue)<<16)+(u32)dreq->wIndex; - dprintf("\n DATA_LENGTH :"); + dprintf("\n DATA_LENGTH:\t"); serial_put_hex(ops_length); return ERR_OK; } @@ -219,20 +213,18 @@ int NAND_OPS_Handle(u8 *buf) } break; case NAND_ERASE: - dprintf("\n Request : NAND_ERASE!"); + dprintf("\n Request : NAND_ERASE"); ret_dat = nand_erase(ops_length,start_addr, Hand.nand_force_erase); handshake_PKT[0] = (u16) ret_dat; handshake_PKT[1] = (u16) (ret_dat>>16); HW_SendPKT(1,handshake_PKT,sizeof(handshake_PKT)); udc_state = IDLE; - dprintf("\n Request : NAND_ERASE_FINISH!"); + dprintf(" ... finished."); break; case NAND_READ: dprintf("\n Request : NAND_READ!"); -// dprintf("\n Option : %x",option); - switch (option) - { + switch (option) { case OOB_ECC: ret_dat = nand_read(Bulk_in_buf,start_addr,ops_length,OOB_ECC); handshake_PKT[0] = (u16) ret_dat; @@ -255,21 +247,20 @@ int NAND_OPS_Handle(u8 *buf) udc_state = BULK_IN; break; } - dprintf("\n Request : NAND_READ_FUNISH!"); + dprintf(" ... finished."); break; case NAND_PROGRAM: dprintf("\n Request : NAND_PROGRAM!"); -// dprintf("\n Option : %x",option); ret_dat = nand_program((void *)Bulk_out_buf, start_addr,ops_length,option); - dprintf("\n NAND_PROGRAM finish!"); handshake_PKT[0] = (u16) ret_dat; handshake_PKT[1] = (u16) (ret_dat>>16); HW_SendPKT(1,handshake_PKT,sizeof(handshake_PKT)); udc_state = IDLE; + dprintf(" ... finished."); break; case NAND_READ_TO_RAM: - dprintf("\n Request : NAND_READNAND!"); + dprintf("\n Request : NAND_READ_TO_RAM!"); nand_read((u8 *)ram_addr,start_addr,ops_length,NO_OOB); __dcache_writeback_all(); handshake_PKT[3]=(u16)ERR_OK; @@ -293,7 +284,7 @@ int SDRAM_OPS_Handle(u8 *buf) switch ((dreq->wValue)&0xf) { case SDRAM_LOAD: -// dprintf("\n Request : SDRAM_LOAD!"); + //dprintf("\n Request : SDRAM_LOAD!"); ret_dat = (u32)memcpy((u8 *)start_addr,Bulk_out_buf,ops_length); handshake_PKT[0] = (u16) ret_dat; handshake_PKT[1] = (u16) (ret_dat>>16); @@ -312,16 +303,10 @@ void Borad_Init() { case 0x4740: //Init nand flash - nand_init_4740(Hand.nand_bw,Hand.nand_rc,Hand.nand_ps,Hand.nand_ppb, - Hand.nand_bbpage,Hand.nand_bbpos,Hand.nand_force_erase,Hand.nand_eccpos); + nand_init_4740(Hand.nand_bw, Hand.nand_rc, Hand.nand_ps, + Hand.nand_ppb, Hand.nand_bbpage, Hand.nand_bbpos, + Hand.nand_force_erase, Hand.nand_eccpos); - dprintf("\nnand_ps, nand_ppb, nand_bbpage, nand_bbpos, nand_eccpos\n"); - serial_put_hex(Hand.nand_ps); - serial_put_hex(Hand.nand_ppb); - serial_put_hex(Hand.nand_bbpage); - serial_put_hex(Hand.nand_bbpos); - serial_put_hex(Hand.nand_eccpos); - nand_program = nand_program_4740; nand_erase = nand_erase_4740; nand_read = nand_read_4740; @@ -355,21 +340,23 @@ void Borad_Init() int CONFIGRATION_Handle(u8 *buf) { + dprintf("\n Configuration:\t"); + USB_DeviceRequest *dreq = (USB_DeviceRequest *)buf; - switch ((dreq->wValue)&0xf) - { + switch ((dreq->wValue)&0xf) { case DS_flash_info: - dprintf("\n configration :DS_flash_info_t!"); + dprintf("DS_flash_info_t!"); config_flash_info(); break; case DS_hand: - dprintf("\n configration :DS_hand_t!"); + dprintf("DS_hand_t!"); config_hand(); break; - default:; - + default: + ; } + Borad_Init(); return ERR_OK; } diff --git a/usbboot/xburst_stage2/main.c b/usbboot/xburst_stage2/main.c index 43f0502..6d87dd4 100644 --- a/usbboot/xburst_stage2/main.c +++ b/usbboot/xburst_stage2/main.c @@ -57,11 +57,11 @@ void c_main(void) if ( fw_args->use_uart > 3 ) fw_args->use_uart = 0; UART_BASE = 0xB0030000 + fw_args->use_uart * 0x1000; - serial_puts("Start address is :"); + serial_puts("\n Stage2 start address is :\t"); serial_put_hex(start_addr); - serial_puts("Address offset is:"); + serial_puts("\n Address offset is:\t"); serial_put_hex(offset); - serial_puts("GOT correct to :"); + serial_puts("\n GOT correct to :\t"); serial_put_hex(got_start); usb_main(); diff --git a/usbboot/xburst_stage2/serial.c b/usbboot/xburst_stage2/serial.c index acb110f..f5bc593 100644 --- a/usbboot/xburst_stage2/serial.c +++ b/usbboot/xburst_stage2/serial.c @@ -89,9 +89,9 @@ void serial_init(void) void serial_put_hex(unsigned int d) { - unsigned char c[12]; + unsigned char c[9]; char i; - for(i = 0; i < 8;i++) + for(i = 0; i < 8; i++) { c[i] = (d >> ((7 - i) * 4)) & 0xf; if(c[i] < 10) @@ -99,7 +99,9 @@ void serial_put_hex(unsigned int d) else c[i] += (0x41 - 10); } - c[8] = '\n'; - c[9] = 0; + + c[8] = 0; + + serial_puts("0x"); serial_puts(c); }