1 /*
2  * Copyright (c) 2015, Freescale Semiconductor, Inc.
3  * Copyright 2016-2017 NXP
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 /*! \file hal_frdm_fxs_mult2_b.c
10     \brief Hardware Abstraction layer for the FRDM-FXS-MULT2-B sensor shield.
11 */
12 
13 #include "sensor_fusion.h"  // top level magCal and sensor fusion interfaces
14 
15 // This HAL (Hardware Abstraction Layer) is applicable to:
16 // FRDM_K64F +
17 // FRDM_FXS_MULT2_B utilizing the FX0S8700 and FXAS21002 on the shield
18 // It also works for the FRDM-STBC_AGM01 board.
19 // It also works for the FRDM-STBC_AGM02 board (the driver_MAG3110.c inverts
20 // the MAG3110 Z-axis reading to enforce +Z = up, so compatibility is maintained)
21 
ApplyAccelHAL(struct AccelSensor * Accel)22 void ApplyAccelHAL(struct AccelSensor *Accel)
23 {
24 	int8 i;				// loop counter
25 
26 	// apply HAL to all measurements read from FIFO buffer
27 	for (i = 0; i < Accel->iFIFOCount; i++)
28 	{
29 		// apply HAL mapping to coordinate system used
30 #if THISCOORDSYSTEM == NED
31 		int16 itmp16 = Accel->iGsFIFO[i][CHX];
32 		Accel->iGsFIFO[i][CHX] = Accel->iGsFIFO[i][CHY];
33 		Accel->iGsFIFO[i][CHY] = itmp16;
34 #endif // NED
35 #if THISCOORDSYSTEM == ANDROID
36 		Accel->iGsFIFO[i][CHX] = -Accel->iGsFIFO[i][CHX];
37 		Accel->iGsFIFO[i][CHY] = -Accel->iGsFIFO[i][CHY];
38 #endif // Android
39 #if (THISCOORDSYSTEM == WIN8)
40 		Accel->iGsFIFO[i][CHZ] = -Accel->iGsFIFO[i][CHZ];
41 #endif // Win8
42 
43 	} // end of loop over FIFO count
44 
45 	return;
46 }
47 
48 // function applies the hardware abstraction layer to the magnetometer readings
ApplyMagHAL(struct MagSensor * Mag)49 void ApplyMagHAL(struct MagSensor *Mag)
50 {
51 	int8 i;				// loop counter
52 
53 	// apply HAL to all measurements read from FIFO buffer
54 	for (i = 0; i < Mag->iFIFOCount; i++)
55 	{
56 		// apply HAL mapping to coordinate system used
57 #if THISCOORDSYSTEM == NED
58 		int16 itmp16 = Mag->iBsFIFO[i][CHX];
59 		Mag->iBsFIFO[i][CHX] = -Mag->iBsFIFO[i][CHY];
60 		Mag->iBsFIFO[i][CHY] = -itmp16;
61 		Mag->iBsFIFO[i][CHZ] = -Mag->iBsFIFO[i][CHZ];
62 #endif // NED
63 #if THISCOORDSYSTEM == ANDROID
64 		Mag->iBsFIFO[i][CHX] = -Mag->iBsFIFO[i][CHX];
65 		Mag->iBsFIFO[i][CHY] = -Mag->iBsFIFO[i][CHY];
66 #endif // Android
67 #if THISCOORDSYSTEM == WIN8
68 		Mag->iBsFIFO[i][CHX] = -Mag->iBsFIFO[i][CHX];
69 		Mag->iBsFIFO[i][CHY] = -Mag->iBsFIFO[i][CHY];
70 #endif
71 	} // end of loop over FIFO count
72 
73 	return;
74 }
75 
76 // function applies the hardware abstraction layer to the gyro readings
ApplyGyroHAL(struct GyroSensor * Gyro)77 void ApplyGyroHAL(struct GyroSensor *Gyro)
78 {
79 	int8 i;				// loop counter
80 
81 	// apply HAL to all measurements read from FIFO buffer
82 	for (i = 0; i < Gyro->iFIFOCount; i++)
83 	{
84 		// apply HAL mapping to coordinate system used
85 #if THISCOORDSYSTEM == NED
86 		int16 itmp16 = Gyro->iYsFIFO[i][CHX];
87 		Gyro->iYsFIFO[i][CHX] = -Gyro->iYsFIFO[i][CHY];
88 		Gyro->iYsFIFO[i][CHY] = -itmp16;
89 		Gyro->iYsFIFO[i][CHZ] = -Gyro->iYsFIFO[i][CHZ];
90 #endif // NED
91 #if THISCOORDSYSTEM == ANDROID
92 		Gyro->iYsFIFO[i][CHX] = -Gyro->iYsFIFO[i][CHX];
93 		Gyro->iYsFIFO[i][CHY] = -Gyro->iYsFIFO[i][CHY];
94 #endif // Android
95 #if THISCOORDSYSTEM == WIN8
96 		Gyro->iYsFIFO[i][CHX] = -Gyro->iYsFIFO[i][CHX];
97 		Gyro->iYsFIFO[i][CHY] = -Gyro->iYsFIFO[i][CHY];
98 #endif // Win8
99 
100 	} // end of loop over FIFO count
101 
102 	return;
103 }
104 
105