void jtag_command_queue_reset(void)
{
	cmd_queue_free();

	jtag_command_queue = NULL;
	next_command_pointer = &jtag_command_queue;
}
Beispiel #2
0
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;
}