view src/gpf2/osl/os_com_ir.c @ 635:baa0a02bc676

niq32.c DTR handling restored for targets that have it TI's original TCS211 fw treated GPIO 3 as the DTR input (wired so on C-Sample and D-Sample boards, also compatible with Leonardo and FCDEV3B which have a fixed pull-down resistor on this GPIO line), and the code in niq32.c called UAF_DTRInterruptHandler() (implemented in uartfax.c) from the IQ_KeypadGPIOHandler() function. But on Openmoko's GTA02 with their official fw this GPIO is a floating input, all of the DTR handling code in uartfax.c including the interrupt logic is still there, but the hobbled TCS211-20070608 semi-src delivery which OM got from TI contained a change in niq32.c (which had been kept in FC until now) that removed the call to UAF_DTRInterruptHandler() as part of those not-quite-understood "CC test" hacks. The present change fixes this bug at a long last: if we are building fw for a target that has TI's "classic" DTR & DCD GPIO arrangement (dsample, fcmodem and gtm900), we bring back all of TI's original code in both uartfax.c and niq32.c, whereas if we are building fw for a target that does not use this classic GPIO arrangement, the code in niq32.c goes back to what we got from OM and all DTR & DCD code in uartfax.c is conditioned out. This change also removes the very last remaining bit of "CC test" bogosity from our FreeCalypso code base.
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 19 Jan 2020 01:41:35 +0000
parents a996d0429c59
children
line wrap: on
line source

/*
 * This C module is a reconstruction based on the disassembly of
 * os_com.obj in frame_na7_db_ir.lib from the Leonardo package.
 */

/* set of included headers from COFF symtab: */
#include <stdio.h>
#include <string.h>
#include "nucleus.h"
#include "typedefs.h"
#include "os.h"
#include "gdi.h"
#include "os_types.h"
#include "os_glob.h"

extern TC_PROTECT TCD_System_Protect;
extern VOID TCT_Protect(TC_PROTECT *protect);
extern VOID TCT_Unprotect(VOID);
extern VOID TCT_Unprotect_Specific(TC_PROTECT *protect);

#define My_System_Protect()   TCT_Protect(&TCD_System_Protect)
#define My_System_Unprotect() TCT_Unprotect_Specific(&TCD_System_Protect)

extern T_OS_COM_TABLE_ENTRY ComTable[];
extern unsigned os_tick_to_time_multiplier;

extern int ObtainSemaphoreCB(NU_SEMAPHORE *SemCB, ULONG Timeout,
				USHORT wait_check);
extern int ReleaseSemaphoreCB(NU_SEMAPHORE *SemCB);

GLOBAL LONG
os_SendToQueue(OS_HANDLE TaskHandle, OS_HANDLE ComHandle, USHORT Priority,
		ULONG Suspend, OS_QDATA *Msg)
{
	T_OS_COM_TABLE_ENTRY *pTable;
	T_QDATA_ELEMENT *elem;
	T_QUEUE *queue;
	int ret;
	NU_SEMAPHORE *CBPtr;
	USHORT watmark;

	if (ComHandle <= 0 || ComHandle > MaxCommunications)
		return(OS_INVALID_QUEUE);
	pTable = ComTable + ComHandle;
	if (!pTable->Name[0])
		return(OS_INVALID_QUEUE);
	CBPtr = &pTable->FreeSemCB;
	ret = ObtainSemaphoreCB(CBPtr, Suspend, 1);
	if (ret == OS_ERROR || ret == OS_TIMEOUT)
		return(ret);
	My_System_Protect();
	elem = pTable->pFreeElement;
	pTable->pFreeElement = elem->pNext;
	memcpy(&elem->Data, Msg, sizeof(OS_QDATA));
	queue = &pTable->Queue[Priority - OS_MIN_PRIORITY];
	*queue->pWrite++ = &elem->Data;
	if (queue->pWrite - queue->pStart >= pTable->Entries + 1)
		queue->pWrite = queue->pStart;
	watmark = pTable->Entries - CBPtr->sm_semaphore_count;
	if (pTable->MaxUsed < watmark)
		pTable->MaxUsed = watmark;
	My_System_Unprotect();
	ReleaseSemaphoreCB(&pTable->UsedSemCB);
	return(ret);
}

GLOBAL LONG
os_ReceiveFromQueue(OS_HANDLE TaskHandle, OS_HANDLE ComHandle,
			OS_QDATA *Msg, ULONG Timeout)
{
	T_QDATA_ELEMENT *pElem;
	UNSIGNED c_time;
	int ret;
	USHORT i;
	T_QUEUE *pQueue;
	T_OS_COM_TABLE_ENTRY *pTable;

	pTable = ComTable + ComHandle;
	if (!pTable->Name[0])
		return(OS_ERROR);
	pTable->current_msg.type = 0;
	ret = ObtainSemaphoreCB(&pTable->UsedSemCB, Timeout, 0);
	if (ret == OS_ERROR || ret == OS_TIMEOUT)
		return(ret);
	My_System_Protect();
	for (i = OS_MAX_PRIORITY; i >= OS_MIN_PRIORITY; i--) {
		pQueue = &pTable->Queue[i - OS_MIN_PRIORITY];
		if (pQueue->pWrite != pQueue->pRead)
			break;
	}
	if (i < OS_MIN_PRIORITY) {
		My_System_Unprotect();
		ReleaseSemaphoreCB(&pTable->FreeSemCB);
		return(OS_ERROR);
	}
	memcpy(Msg, *pQueue->pRead, sizeof(OS_QDATA));
	pElem = (T_QDATA_ELEMENT *)*pQueue->pRead++;
	pElem->Data.data16 = 0;
	pElem->pNext = pTable->pFreeElement;
	pTable->pFreeElement = pElem;
	if (pQueue->pRead - pQueue->pStart >= pTable->Entries + 1)
		pQueue->pRead = pQueue->pStart;
	pTable->current_msg.type = Msg->data16;
	pTable->current_msg.opc = Msg->data32;
	c_time = NU_Retrieve_Clock();
	pTable->current_msg.time = SYSTEM_TICKS_TO_TIME(c_time);
	pTable->current_msg.ptr = Msg->ptr;
	My_System_Unprotect();
	ReleaseSemaphoreCB(&pTable->FreeSemCB);
	return(OS_OK);
}