/*
     This file is the API to a hardware mutex device for FreeRTOS.
 */

/***************************** Include Files *********************************/

/*****************************************************************************
* Filename:          C:\Users\tseng\Desktop\edk_test\ml509_quad_one_plb\drivers/user_mutex_v1_00_a/src/user_mutex.c
* Version:           1.00.a
* Description:       user_mutex (new FSL core) Driver Source File
* Date:              Thu Jul 11 11:23:19 2013 (by Create and Import Peripheral Wizard)
*****************************************************************************/
#include <stdio.h>
#include "portmutex.h"

int mutex_lock(int mutex_num, int task_id)
{
    int LockPattern = ((task_id << 1) | 1);
    int value;

    while(1)
    {
		portBASE_TYPE interruptsRequireEnabling = xPortAreInterruptsEnabled();
		if (interruptsRequireEnabling)
		{
			portDISABLE_INTERRUPTS();
		}
        write_into_fsl(0, input_slot_id);//function = lock
        write_into_fsl(mutex_num, input_slot_id);//mutex number
        write_into_fsl(LockPattern, input_slot_id);//pattern
        read_from_fsl(value, output_slot_id);
		if (interruptsRequireEnabling)
		{
			portENABLE_INTERRUPTS();
		}
        if (value == LockPattern)
        {
            break;
        }
    }
    return value;
}

int mutex_unlock(int mutex_num, int task_id)
{
    int LockPattern = ((task_id << 1) | 1);
    int value = 1;

    while(1)
    {
        write_into_fsl(1, input_slot_id);//function = unlock
        write_into_fsl(mutex_num, input_slot_id);//mutex number
        write_into_fsl(LockPattern, input_slot_id);//pattern
        read_from_fsl(value, output_slot_id);
        if (value == 0)
        {
            break;
        }
    }
    return (value == 0);
}

int mutex_unlock2(int mutex_num, int CPU_ID)
{
	int LockPattern = ((CPU_ID << 1) | 1);
	int value = 1;
	while(1){
		portBASE_TYPE interruptsRequireEnabling = xPortAreInterruptsEnabled();
		if (interruptsRequireEnabling) {
			portDISABLE_INTERRUPTS();
		}
		write_into_fsl(1, input_slot_id);//function = unlock
		write_into_fsl(mutex_num, input_slot_id);//mutex number
		write_into_fsl(LockPattern, input_slot_id);//pattern
		read_from_fsl(value, output_slot_id);
		if (interruptsRequireEnabling) {
			portENABLE_INTERRUPTS();
		}
		if(value == 0)
			break;
	}
	return (value == 0);
}
