summaryrefslogtreecommitdiffstats
path: root/src/occ/gpe/apss_altitude.pS
blob: 6deac1de09acf63ec58f96864a8e43e65576c253 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# *****************************************************************************
# @file apss_altitude.S
# @brief Read the altitude from the APSS
#

# *****************************************************************************
#
#       @page ChangeLogs Change Logs
#       @section apss_altitude.S APSS_ALTITUDE.S
#       @verbatim
#
#   Flag    Def/Fea    Userid    Date        Description
#   ------- ---------- --------  ----------  ----------------------------------
#   @rc003             rickylie  02/03/2012  Verify & Clean Up OCC Headers & Comments
#
#  @endverbatim
#
# *****************************************************************************


        //////////////////////////////////////////////////////////////////////
        // Includes
        //////////////////////////////////////////////////////////////////////
        .nolist
#include "pgp.h"
#include "pgas.h"
        .list

        //////////////////////////////////////////////////////////////////////
        // Define Address Space
        //////////////////////////////////////////////////////////////////////
        .oci

        //////////////////////////////////////////////////////////////////////
        // Define Symbols
        //////////////////////////////////////////////////////////////////////

#include <pss_constants.h>

#define GPE_PROG_ID 0x0002

        //////////////////////////////////////////////////////////////////////
        // Define Structures
        //////////////////////////////////////////////////////////////////////
        
        // Declare the offsets of the struct that will be passed to the 
        // GPE program via the ETR register
        //
        // struct G_gpe_apss_read_altitude_args =
        // {
        .struct     0
ERROR_RC:
          .struct ERROR_RC + 8
ERROR_FFDC:
          .struct ERROR_FFDC + 8
ALTITUDE:
        // };
        

        //////////////////////////////////////////////////////////////////////
        // Begin Program
        //////////////////////////////////////////////////////////////////////

        .text

#include <gpe_macros.h>
#include <pss_macros.h>


      //--------------------------------------------------------------------
      // PORE-GPE Routine Specification:
      //
      // Name: GPE_apss_read_altitude
      //
      // Description:  Initialize APSS GPIO pins for Input/Output, Interrupt
      //               Drive H/L
      //
      // Inputs:       G_gpe_apss_read_altitude_args
      //     struct {
      //         PoreGpeErrorStruct error;
      //         uint16_t altitude;     // This is where the altitude will be stored (output)
      //         uint8_t reserved[6];   // Requried since GPE only does 8 byte writes.
      //     } G_gpe_apss_read_altitude_args
      //     struct {
      //         uint64_t rc;          // This should be read as 63:32=addr, 31:0=rc
      //         uint64_t ffdc;        // Whatever GPE program puts in for FFDC data
      //     } PoreGpeErrorStruct;
      //
      // Outputs:      Altitude (and FFDC on failure)
      //
      // Flow:  7/20/11    FN=GPE_apss_set_composite_mode
      //
      // References: APSS FUnctional Specification v0.7.18
      //             GPE_apss_access_scoms.odt (summary of regisers/data)
      //
      // End PORE-GPE Routine Specification
      //--------------------------------------------------------------------
      .global GPE_apss_read_altitude
GPE_apss_read_altitude:

        // Copy passed Structure Pointer into A1
        mr      A1, ETR

        // Wait for SPI operations to be complete (10usec timeout)
        _wait_for_spi_ops_complete 10, error_timeout

        // Setup control regs
        // frame_size=16, out_count=16, in_delay1=never, in_count2=16
        _putscom SPIPSS_P2S_CTRL_REG0, 0x410FC00004000000
        // bridge_enable, clock_divider=7, 2 frames
        _putscom SPIPSS_P2S_CTRL_REG1, 0x801C400000000000
        // inter_frame_delay=25 (2.5usec)
        _putscom SPIPSS_P2S_CTRL_REG2, 0x000C800000000000

        // APSS command to get the altitude (APSS cmd 0x9000)
        li      D0, 0x9000000000000000
        _putscom_d0 SPIPSS_P2S_WDATA_REG

        // Start SPI transaction
        _putscom SPIPSS_P2S_COMMAND_REG, 0x8000000000000000

        // wait 10usec for command to complete
        waits (10 * MICROSECONDS)

        // Wait for SPI operations to be complete (10usec timeout)
        _wait_for_spi_ops_complete 10, error_altitude_timeout

        // Read altitude and store in structure
        _getscom SPIPSS_P2S_RDATA_REG
        // The scom data for that cmd is in 2nd two bytes of the register (shift left 2 bytes)
        rols    D0, D0, 16
        std     D0, ALTITUDE, A1

        halt      // End of GPE_apss_initialize_gpio


error_statusreg:
        // An error/reserved bit was set when reading p2s status register...
        // D0: P2S_STATUS_REG
        _saveffdc GPE_PROG_ID, 0x0002
        halt


error_timeout:
        // p2s_ongoing bit was never cleared after several retries...
        // D0: P2S_STATUS_REG
        _saveffdc GPE_PROG_ID, 0x0001
        halt


error_altitude_timeout:
        // After sending the read altitude command, the p2s_ongoing bit was
        // never cleared after several retries...
        // D0: P2S_STATUS_REG
        _saveffdc GPE_PROG_ID, 0x0003
        halt


        //////////////////////////////////////////////////////////////////////
        // End of Program
        //////////////////////////////////////////////////////////////////////


OpenPOWER on IntegriCloud