void jtag_command_queue_reset(void) { cmd_queue_free(); jtag_command_queue = NULL; next_command_pointer = &jtag_command_queue; }
int32_t nand_reset_identy(nand_cfg_t * cfg,struct aml_nand_platform * plat,cntl_t *cntl) { clrbits_le32(P_PAD_PULL_UP_REG3,(0xff<<0) | (1<<16)); int32_t num,i,max_ce; void * addr; max_ce=min(cntl->feature&FEATURE_SUPPORT_MAX_CES,plat->ce_num?plat->ce_num:FEATURE_SUPPORT_MAX_CES); struct id_read_s *id; addr=dma_alloc_coherent(max_ce*sizeof(struct id_read_s),(dma_addr_t *)&id); jobkey_t * job[5]; for(i=0;i<5;i++) job[i]=cntl_job_get((i|0x100)); #if 0 for(i=0;i<max_ce;i++) { cntl_ctrl(i,NAND_CLE(NAND_CMD_RESET)); } for(i=0;i<max_ce;i++) { cntl_nop(i,1); cntl_ctrl(i,NAND_CLE(NAND_CMD_STATUS)); cntl_wait(i,NAND_RB_IO6,31);//wait for 1M/16 nand cycle , about 1sec cntl_sts(job[i],STS_NO_INTERRUPT); /// read uni id cntl_ctrl(i,NAND_CLE(NAND_CMD_READID)); cntl_ctrl(i,NAND_ALE(0)); cntl_readbytes(&id[i].id,sizeof(id[i].id)); /// read onfi id cntl_ctrl(i,NAND_CLE(NAND_CMD_READID)); cntl_ctrl(i,NAND_ALE(0x20)); cntl_readbytes(&id[i].onfi,sizeof(id[i].onfi)); } cntl_sts(job[4],STS_NO_INTERRUPT); #else cmd_queue_t *pout; cmd_queue_t * p=cmd_queue_alloc(); uint32_t cemask=0; int32_t stat[max_ce]; assert(p!=NULL); for (i = 0; i < max_ce; i++) { stat[i]=NAND_CMD_STAT_START; } while (cemask != ((1 << max_ce) - 1)) { for (i = 0; i < max_ce; i++) { if(stat[i]==NAND_CMD_STAT_END) continue; stat[i]=nand_reset_identy_queue(p,stat[i],i,&id[i],job[i]); if(stat[i]==NAND_CMD_STAT_END) cemask|=(1<<i); } } nand_write_finish(p,job[4]); pout=cmd_queue_alloc(); cntl_write_cmd(p,pout); cmd_queue_free(p); cmd_queue_free(pout); #endif while(cntl_job_status(job[4],4|0x100)<0) { uint32_t ce; if(cntl_error(&ce)==NAND_CNTL_ERROR_TIMEOUT) { nanddebug(1,"ce %d timeout",ce); cntl_continue(); } }; amlogic_log_print(); printf("\n"); /** * @todo implement this function if(nand_cfg_set(&nand_cfg,0,id)<0) return -1; */ for(i=0;i<max_ce;i++) { nanddebug(1,"CE%d:id=%llx,onfi=%llx,sts=%x",i,id[i].id,id[i].onfi,cntl_job_status(job[i],i|0x100)); cntl_job_free(job[i]); } cntl_job_free(job[4]); nand_cfg.ce_mask=1; num=1; for(i=1;i<max_ce;i++) { if(id[i].id!=id[0].id||id[i].onfi!=id[0].onfi) { nand_cfg.ce_mask&=~(1<<i); continue; } nand_cfg.ce_mask|=(1<<i); num++; } dma_free_coherent(max_ce*sizeof(struct id_read_s),(dma_addr_t )id,addr); return num; }