view src/cs/drivers/drv_app/spi/spi_api.c @ 673:62a5285e014a

Lorekeeping: allow tpudrv-leonardo.lib on Leonardo/Tango Back in 2015 the Mother's idea was to produce a FreeCalypso development board that would be a clone of TI Leonardo, including the original quadband RFFE; one major additional stipulation was that this board needed to be able to run original unmodified TCS211-20070608 firmware with all blobs intact, with only minimal binary patches to main.lib and tpudrv.lib. The necessary patched libs were produced at that time in the tcs211-patches repository. That plan was changed and we produced FCDEV3B instead, with Openmoko's triband RFFE instead of Leonardo quadband, but when FC Magnetite started in 2016, a TPUDRV_blob= provision was still made, allowing the possibility of patching OM's tpudrv.lib for a restored Leonardo RFFE. Now in 2020 we have FC Tango which is essentially a verbatim clone of Leonardo core, including the original quadband RFFE. We have also deblobbed our firmware so much that we have absolutely no real need for a blob version of tpudrv.lib - but I thought it would be neat to put the ancient TPUDRV_blob= mechanism (classic config) to its originally intended use, just for the heck of it.
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 29 May 2020 03:55:36 +0000
parents 945cf7f506b2
children
line wrap: on
line source

/*********************************************************************************
*
*	File Name: spi_api.c
*
*	Bridge functions used to send events to the SPI task 
*
*	(C) Texas Instruments, all rights reserved
*
*	Version number: 0.1		Date: 25-September-2000
*
*	History: 0.1 - Created by Candice Bazanegue
*
*	Author: 
*
*********************************************************************************/

#include "rvf/rvf_api.h"
#include "spi/spi_api.h"
#include "spi/spi_env.h"
#include "spi/spi_process.h"
#include "rvm/rvm_use_id_list.h"



/********************************************************************************/
/*                                                                              */
/*    Function Name:   spi_abb_read                                             */
/*                                                                              */
/********************************************************************************/
T_RV_RET spi_abb_read(UINT16 page, UINT16 address, CALLBACK_FUNC_U16 CallBack)
{
   T_SPI_READ *msgPtr;

   /* check if the driver has been started */
   if (SPI_GBL_INFO_PTR == NULL)
   {
      rvf_send_trace("ABB read not possible. Reason: SPI task not started",51, NULL_PARAM, 
                     RV_TRACE_LEVEL_WARNING, SPI_USE_ID);
      return (RVM_NOT_READY);
   }

   if(SPI_GBL_INFO_PTR->SpiTaskReady == FALSE)
   {
      rvf_send_trace("ABB read not possible. Reason: SPI Task not ready",49, NULL_PARAM, 
                     RV_TRACE_LEVEL_WARNING, SPI_USE_ID);
      return (RVM_NOT_READY);
   }

   rvf_send_trace("SPI_ABB_READ",12, NULL_PARAM, 
                  RV_TRACE_LEVEL_WARNING, SPI_USE_ID);

   if (rvf_get_buf (SPI_GBL_INFO_PTR->prim_id, sizeof (T_SPI_READ),(void **) &msgPtr) == RVF_RED)
   {
      rvf_send_trace ("SPI ERROR: ABB read not possible. Reason: Not enough memory",
                      59,
                      NULL_PARAM,
                      RV_TRACE_LEVEL_ERROR,
                      SPI_USE_ID);

      return (RV_MEMORY_ERR);
   }

   (msgPtr->os_hdr).msg_id        = SPI_ABB_READ_EVT;
   (msgPtr->os_hdr).dest_addr_id  = SPI_GBL_INFO_PTR->addr_id;
   (msgPtr->os_hdr).callback_func = (CALLBACK_FUNC) CallBack;
   msgPtr->page = page;
   msgPtr->address = address;

   rvf_send_msg (SPI_GBL_INFO_PTR->addr_id,
                 msgPtr);

   return (RV_OK);
}




/********************************************************************************/
/*                                                                              */
/*    Function Name:   spi_abb_write                                            */
/*                                                                              */
/********************************************************************************/
T_RV_RET spi_abb_write(UINT16 page, UINT16 address, UINT16 data)
{
   T_SPI_WRITE *msgPtr;

   /* check if the driver has been started */
   if (SPI_GBL_INFO_PTR == NULL)
   {
      rvf_send_trace("ABB write not possible. Reason: SPI task not started",52, NULL_PARAM, 
                     RV_TRACE_LEVEL_WARNING, SPI_USE_ID);
      return (RVM_NOT_READY);
   }

   if(SPI_GBL_INFO_PTR->SpiTaskReady == FALSE)
   {
      rvf_send_trace("ABB write not possible. Reason: SPI Task not ready",50, NULL_PARAM, 
                     RV_TRACE_LEVEL_WARNING, SPI_USE_ID);
      return (RVM_NOT_READY);
   }

   if (rvf_get_buf (SPI_GBL_INFO_PTR->prim_id, sizeof (T_SPI_WRITE),(void **) &msgPtr) == RVF_RED)
   {
      rvf_send_trace ("SPI ERROR: ABB write not possible. Reason: Not enough memory",
                      60,
                      NULL_PARAM,
                      RV_TRACE_LEVEL_ERROR,
                      SPI_USE_ID);

      return (RV_MEMORY_ERR);
   }

   (msgPtr->os_hdr).msg_id        = SPI_ABB_WRITE_EVT;
   (msgPtr->os_hdr).dest_addr_id  = SPI_GBL_INFO_PTR->addr_id;
   (msgPtr->os_hdr).callback_func = NULL;
   msgPtr->page = page;
   msgPtr->address = address;
   msgPtr->data = data;

   rvf_send_msg (SPI_GBL_INFO_PTR->addr_id, msgPtr);

   return (RV_OK);
}




/********************************************************************************/
/*                                                                              */
/*    Function Name:   spi_abb_conf_ADC                                         */
/*                                                                              */
/********************************************************************************/
T_RV_RET spi_abb_conf_ADC(UINT16 channels, UINT16 itval)
{
   T_SPI_ABB_CONF_ADC *msgPtr;

   /* check if the driver has been started */
   if (SPI_GBL_INFO_PTR == NULL)
   {
      rvf_send_trace("ABB conf ADC not possible. Reason: SPI task not started",55, NULL_PARAM, 
                     RV_TRACE_LEVEL_WARNING, SPI_USE_ID);
      return (RVM_NOT_READY);
   }

   if(SPI_GBL_INFO_PTR->SpiTaskReady == FALSE)
   {
      rvf_send_trace("ABB conf ADC not possible. Reason: SPI Task not ready",53, NULL_PARAM, 
                     RV_TRACE_LEVEL_WARNING, SPI_USE_ID);
      return (RVM_NOT_READY);
   }

   rvf_send_trace("SPI_ABB_CONF_ADC",16, NULL_PARAM, 
                  RV_TRACE_LEVEL_WARNING, SPI_USE_ID);

   if (rvf_get_buf (SPI_GBL_INFO_PTR->prim_id, sizeof (T_SPI_ABB_CONF_ADC),(void **) &msgPtr) == RVF_RED)
   {
      rvf_send_trace ("SPI ERROR: ABB conf ADC not possible. Reason: Not enough memory",
                      63,
                      NULL_PARAM,
                      RV_TRACE_LEVEL_ERROR,
                      SPI_USE_ID);

      return (RV_MEMORY_ERR);
   }

   (msgPtr->os_hdr).msg_id        = SPI_ABB_CONF_ADC_EVT;
   (msgPtr->os_hdr).dest_addr_id  = SPI_GBL_INFO_PTR->addr_id;
   (msgPtr->os_hdr).callback_func = NULL;
   msgPtr->channels               = channels;
   msgPtr->itval                  = itval;

   rvf_send_msg (SPI_GBL_INFO_PTR->addr_id, msgPtr);

   return (RV_OK);
}



/********************************************************************************/
/*                                                                              */
/*    Function Name:   spi_abb_read_ADC                                         */
/*                                                                              */
/********************************************************************************/
T_RV_RET spi_abb_read_ADC(UINT16 *Buff, CALLBACK_FUNC_NO_PARAM CallBack)
{
   T_SPI_ABB_READ_ADC *msgPtr;

   /* check if the driver has been started */
   if (SPI_GBL_INFO_PTR == NULL)
   {
      rvf_send_trace("ABB read ADC not possible. Reason: SPI task not started",55, NULL_PARAM, 
                     RV_TRACE_LEVEL_WARNING, SPI_USE_ID);
      return (RVM_NOT_READY);
   }

   if(SPI_GBL_INFO_PTR->SpiTaskReady == FALSE)
   {
      rvf_send_trace("ABB conf ADC not possible. Reason: SPI Task not ready",53, NULL_PARAM, 
                     RV_TRACE_LEVEL_WARNING, SPI_USE_ID);
      return (RVM_NOT_READY);
   }

   rvf_send_trace("SPI_ABB_READ_ADC",16, NULL_PARAM, 
                  RV_TRACE_LEVEL_WARNING, SPI_USE_ID);

   if (rvf_get_buf (SPI_GBL_INFO_PTR->prim_id, sizeof (T_SPI_ABB_READ_ADC),(void **) &msgPtr) == RVF_RED)
   {
      rvf_send_trace ("SPI ERROR: ABB read ADC not possible. Reason: Not enough memory",
                      63,
                      NULL_PARAM,
                      RV_TRACE_LEVEL_ERROR,
                      SPI_USE_ID);

      return (RV_MEMORY_ERR);
   }

   (msgPtr->os_hdr).msg_id        = SPI_ABB_READ_ADC_EVT;
   (msgPtr->os_hdr).dest_addr_id  = SPI_GBL_INFO_PTR->addr_id;
   (msgPtr->os_hdr).callback_func = NULL;
   msgPtr->Buff                   = Buff;
   msgPtr->callback_func          = CallBack;

   rvf_send_msg (SPI_GBL_INFO_PTR->addr_id, msgPtr);

   return (RV_OK);
}