view fluid-mnf/calplus/ram_load.h @ 335:10d62a3bfeec

frbl2test: L command addr and nwords need to be sent in LE byte order
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 07 Mar 2020 05:56:32 +0000
parents 9cecc930d78f
children
line wrap: on
line source

/*                %Z% nom : %M% SID: %I% date : %G%                           */
/* Filename:      %M%                                                         */
/* Version:       %I%                                                         */
/******************************************************************************
 *                   WIRELESS COMMUNICATION SYSTEM DEVELOPMENT
 *
 *             (C) 2002 Texas Instruments France. All rights reserved
 *
 *                          Author : Francois AMAND
 *
 *
 *  Important Note
 *  --------------
 *
 *  This S/W is a preliminary version. It contains information on a product 
 *  under development and is issued for evaluation purposes only. Features 
 *  characteristics, data and other information are subject to change.
 *
 *  The S/W is furnished under Non Disclosure Agreement and may be used or
 *  copied only in accordance with the terms of the agreement. It is an offence
 *  to copy the software in any way except as specifically set out in the 
 *  agreement. No part of this document may be reproduced or transmitted in any
 *  form or by any means, electronic or mechanical, including photocopying and
 *  recording, for any purpose without the express written permission of Texas
 *  Instruments Inc.
 *
 ******************************************************************************
 *
 *  FILE NAME: ram_load.c
 *
 *
 *  PURPOSE:  Describe the RAM loader state machine used during boot procedure
 *            in order to download a FLASH programmer into the Internal RAM if
 *            CALYPSOPLUS chip.
 *
 *
 *
 *  FILE REFERENCES:
 *
 *  Name                  IO      Description
 *  -------------         --      ---------------------------------------------
 *  
 *
 *
 *  EXTERNAL VARIABLES:
 *
 *  Source:
 *
 *  Name                    Type              IO   Description
 *  -------------------     ---------------   --   ----------------------------
 *
 *
 *  EXTERNAL REFERENCES:
 *
 *  Name                Description
 *  ------------------  -------------------------------------------------------
 *
 *
 *
 *  ABNORMAL TERMINATION CONDITIONS, ERROR AND WARNING MESSAGES:
 *  
 *
 *
 *  ASSUMPTION, CONSTRAINTS, RESTRICTIONS:
 *  
 *
 *
 *  NOTES:
 *  
 *
 *
 *  REQUIREMENTS/FUNCTIONAL SPECIFICATION REFERENCES:
 *
 *
 *
 *
 *  DEVELOPMENT HISTORY:
 *
 *  Date        Name(s)         Version  Description
 *  ----------  --------------  -------  --------------------------------------
 *  31-May-02   Francois AMAND  V1.0.0   Import from CALYPSO
 *
 *  ALGORITHM: Use the RAM loader state machine defined in CALPLUS208 specifica-
 *             tion.
 *
 *
 *****************************************************************************/


#ifndef _RAM_LOADER_H_
  #define _RAM_LOADER_H_
  
  /*
   *  Include files
   */
  #include "standard.h"
  #include "secure_types.h"

  #define C_MAX_PLATFORM_DATA 64192

  /*
   *  Main buffer size
   */
  // Include manufacture certificate + platform data + manufacturer certificate signature
  #define C_MAX_BUFFER_SIZE (sizeof(T_MANUFACTURER_CERTIFICATE) + C_MAX_PLATFORM_DATA + C_MANUF_SIG_SIZE * C_WORD32LGB)

  /*
   *  Serial interface choice
   */
  enum {
    #ifdef _SERIAL_IRDA_
      C_SERIAL_ID_MODEM = 0,
      C_SERIAL_ID_IRDA  = 1
    #else
      C_SERIAL_ID_MODEM = 0
    #endif
  };
  
  
  /*
   *  RAM loader state
   */
  typedef enum {
    C_RESET_STATE               = 0,
    C_SIGNALLING_STATE          = 1,
    C_AWAIT_PARAMETER_STATE     = 2,
    C_COMMAND_PHASE_STATE       = 3
  } T_RAM_LOADER_PC_STATE;


  /*
   *  RAM loader event
   */
  typedef enum {
    C_NO_EVENT                  = 0,

    C_USER_DOWNLOAD_REQUEST     = 1,
    C_USER_ABORT_REQUEST        = 2,

    C_SIGNALLING_TIMEOUT        = 3,
    C_WATCHDOG_TIMEOUT          = 4,

    C_SIGNALLING_RESPONSE       = 5,
    C_PARAMETER_ACK_RESPONSE    = 6,
    C_PARAMETER_NACK_RESPONSE   = 7,
    C_WRITE_ACK_RESPONSE        = 8,
    C_WRITE_NACK_RESPONSE       = 9,
    C_CERTIFICATE_ACK_RESPONSE  = 10
  } T_RAM_LOADER_PC_EVENT;


  /*
   *  RAM loader command
   */
  typedef enum {
    C_SIGNALLING_REQUEST_CMD  = 0,
    C_PARAMETER_REQUEST_CMD   = 1,
    C_WRITE_REQUEST_CMD       = 2,
    C_ABORT_REQUEST_CMD       = 3,
    C_CERTIFICATE_REQUEST_CMD = 4
  } T_RAM_LOADER_PC_COMMAND;


  /*
   *  RAM loader timer
   */
  typedef enum {
    C_SIGNALLING_TIMER = 0,
    C_WATCHDOG_TIMER   = 1
  } T_RAM_LOADER_PC_TIMER;
  
  #define C_RAM_LOADER_PC_NB_TIMER 2


  /*
   *  Timeout definition in ms
   */
  #define C_SIGNALLING_TIMEOUT_VALUE 4L       /* 2 ms */
  #define C_WATCHDOG_TIMEOUT_VALUE   120000L  /* 2 mn  */


  /*
   *  RAM loader status
   */
  typedef enum {
    C_NO_STATUS              = 0,
    C_BAD_INPUT_FILE         = 1,
    C_SUCCESS                = 2,
    C_BAD_PARAMETERS         = 3,
    C_ERROR_DURING_WRITE     = 4,
    C_BAD_ADDRESS_OF_BRANCH  = 5,
    C_WATCHDOG_TIMER_REACHED = 6,
    C_USER_ABORT             = 7
  } T_RAM_LOADER_PC_STATUS;


  enum {
    C_COMMAND_NOT_RECEIVED = 0,
    C_COMMAND_RECEIVED     = 1,
    C_SERIAL_TIMEOUT       = 2
  };
  
  typedef struct {
    UWORD8  d_nb_data;
    UWORD32 d_address;
    UWORD8  *p_block;
  } T_WRITE_REQUEST;


  typedef struct {
  	UWORD16	d_max_byte;
  	UWORD8	a_data[sizeof(T_MANUFACTURER_CERTIFICATE_FLASH_PROGRAMMER)];
  } T_FRAME;


  typedef struct {
    UWORD8  d_device_id;
    UWORD8  d_baud_rate;
    char    *p_file_name;

    /*
     *  Signalling response variable
     */
    UWORD16 d_romcode_version;
    UWORD8  a_hash_man_pub_key[C_MD5HASHLG * C_WORD32LGB];
    UWORD8  a_die_id[C_WORD32LGB * C_DIE_ID_SIZE];
    UWORD8  a_Certsig[C_WORD32LGB * C_MANUF_SIG_SIZE];

    /*
     *  Parameter NACK response variable
     */
    UWORD8  d_param_req_sts;

    /*
     *  Certificate request variable
     */
    BOOLEAN b_certificate_request;

    /*
     *  Certificate response variable
     */
    union {
      UWORD8                      a_firm_cert[C_MAX_BUFFER_SIZE]; /* Take into account max data_platform size */
      T_MANUFACTURER_CERTIFICATE_PLATFORM_DATA d_firm_cert;
    } u_firm_cert;

    /*
     *  Command request variable
     */
    UWORD32                       d_uart_timeout;
    union {
      UWORD8                      a_code_certificate[sizeof(T_MANUFACTURER_CERTIFICATE_FLASH_PROGRAMMER)];
      T_MANUFACTURER_CERTIFICATE_FLASH_PROGRAMMER d_code_certificate;
    } u_code_certificate;

    /*
     *  Write request variable
     */
    UWORD32 d_nb_byte_in_block;
    UWORD32 d_nb_byte_sent;
    UWORD8  *p_block_buffer;
    UWORD32 d_block_address;
    UWORD32 d_block_size;

    /*
     *  Mobile received variable
     */
    //UWORD16 d_max_block_size;
    //UWORD16 d_mobile_buffer_size;
    UWORD8 d_write_status;

    //T_WRITE_REQUEST d_parameter_request;
  } T_RAM_LOADER;


  /*
   *  RAM loader baud rate definition
   */
  typedef enum {
    C_BAUD_RATE_812500  = 0,
    C_BAUD_RATE_406250  = 1,
    C_BAUD_RATE_203125  = 2,
    C_BAUD_RATE_115200  = 3,
    C_BAUD_RATE_57600   = 4,
    C_BAUD_RATE_38400   = 5,
    C_BAUD_RATE_28800   = 6,
    C_BAUD_RATE_19200   = 7,
    C_BAUD_RATE_DEFAULT = 7,
    C_BAUD_RATE_9600    = 8
  } T_BAUD_RATE;


  #define C_BLOCK_INDEX_OFFSET   0
  #define C_NB_BLOCK_OFFSET      1
  #define C_BLOCK_SIZE_OFFSET    2
  #define C_BLOCK_ADDRESS_OFFSET 4
  #define C_BLOCK_DATA_OFFSET    8

#endif