bool ApplicationCommandTarget::isCommandActive (const CommandID commandID)
{
    ApplicationCommandInfo info (commandID);
    info.flags = ApplicationCommandInfo::isDisabled;

    getCommandInfo (commandID, info);

    return (info.flags & ApplicationCommandInfo::isDisabled) == 0;
}
Ejemplo n.º 2
0
void NANDController::communicate()
{
	/**************************************************************************************
	 * Read Signals
	 **************************************************************************************/
	for(int i=0; i<NUM_BANKS; i++) {
		RBn[i] = flash_RBn_SSlave[i];
	}



	/* When all banks are idle, set MON_CHABANKIDLE. */
	bool allIdle = true;

	for(int i=0; ( i<NUM_BANKS ) && allIdle; i++) {
		allIdle = getRegister(BSP_FSM(i)) == BS_IDLE;
	}

	if(allIdle && getRegister(WR_STAT) == WR_STAT_IDLE) {
		setRegister(MON_CHABANKIDLE, 0);
	}




	/**************************************************************************************
	 * If Issue flag is on, Execute command
	 **************************************************************************************/
	if(getRegister(FCP_ISSUE) == ISSUE_ENABLE)
	{
		printf( "Command ISSUED\n");

		if(getRegister(WR_STAT) == WR_STAT_BUSY) {
			printf( "Waiting Room is Busy, ignore this command\n");
		}
		else
		{
			getCommandInfo();


			//The Banks FSM is already running.
			if(getRegister(BSP_FSM(curFCPCommand.bank)) != BS_IDLE)
			{
				printf( "%d Bank is busy, put this command into WR\n", curFCPCommand.bank);

				//Active Wating Room.
				setRegister(WR_BANK, curFCPCommand.bank);
				setRegister(WR_STAT, WR_STAT_BUSY);
			}
			else {
				issueCommandToBank(curFCPCommand.bank);
				bIssued[curFCPCommand.bank] = true;
			}

			//set some banks are non-idle.
			setRegister(MON_CHABANKIDLE, 1);
		}

		//Clear ISSUE register
		setRegister(FCP_ISSUE, ISSUE_DISABLE);
	}



	/**************************************************************************************
	 * The bank that has next command in WR will be IDLE state, Issue the command.
	 **************************************************************************************/
	int wrBank = getRegister(WR_BANK);

	if(		getRegister(WR_STAT) == WR_STAT_BUSY		&&
			NextStateOfBanks[wrBank] == BS_IDLE)
	{
		printf( "%d Bank become IDLE, issue CMD to %d Bank from WR\n", wrBank, wrBank);

		issueCommandToBank(wrBank);
		bIssued[wrBank] = true;

		setRegister(WR_STAT, WR_STAT_IDLE);
	}




	/**************************************************************************************
	 * Banks FSM
	 **************************************************************************************/
	for(int i=0; i<NUM_BANKS; i++)
	{
		if(bIssued[i]) {
			runCommand(i);
			bIssued[i] = false;
		}


		combinationalLogicBankFSM(i);
	}




	/**************************************************************************************
	 * Send Drive
	 **************************************************************************************/
	// Send(drive) all the signals set in previous update()
	//ahb_m0_mpms->sendDrive();
	// Send(drive) all the signals set in previous update()
	//ahb_m1_mpms->sendDrive();
	// Send(drive) all the signals set in previous update()
	//ahb_s0_spss->sendDrive();
}