/*
     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 CPU_ID)
{
    int LockPattern = ((CPU_ID << 1) | 1);
    int value;

    if (CPU_ID) printf("%dL ", CPU_ID);
    while(1)
    {
        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 (value == LockPattern)
        {
            break;
        }
    }
    if (CPU_ID) printf("%dE ", CPU_ID);
    return value;
}

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

    if (CPU_ID) printf("%dU ", CPU_ID);
    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;
        }
    }
    if (CPU_ID) printf("%dX ", CPU_ID);
    return (value == 0);
}
