1 /*
2  * Copyright (C) 2015-2021 Alibaba Group Holding Limited
3  */
4 
5 #ifndef __QMC6310_H
6 #define __QMC6310_H
7 #include "k_api.h"
8 #include <math.h>
9 #include <stdbool.h>
10 #include "aos/hal/i2c.h"
11 #include "hal_iomux_haas1000.h"
12 
13 /* vendor chip id*/
14 #define QMC6308_IIC_ADDR                0x2c
15 #define QMC6310U_IIC_ADDR               0x1c
16 #define QMC6310N_IIC_ADDR               0x3c
17 #define QMC6310_CHIP_ID_REG             0x00
18 
19 /*data output register*/
20 #define QMC6310_DATA_OUT_X_LSB_REG      0x01
21 #define QMC6310_DATA_OUT_X_MSB_REG      0x02
22 #define QMC6310_DATA_OUT_Y_LSB_REG      0x03
23 #define QMC6310_DATA_OUT_Y_MSB_REG      0x04
24 #define QMC6310_DATA_OUT_Z_LSB_REG      0x05
25 #define QMC6310_DATA_OUT_Z_MSB_REG      0x06
26 /*Status registers */
27 #define QMC6310_STATUS_REG              0x09
28 /* configuration registers */
29 #define QMC6310_CTL_REG_ONE             0x0A  /* Contrl register one */
30 #define QMC6310_CTL_REG_TWO             0x0B  /* Contrl register two */
31 
32 /* Magnetic Sensor Operating Mode MODE[1:0]*/
33 #define QMC6310_SUSPEND_MODE            0x00
34 #define QMC6310_NORMAL_MODE             0x01
35 #define QMC6310_SINGLE_MODE             0x02
36 #define QMC6310_H_PFM_MODE              0x03
37 
38 /*data output rate OSR2[2:0]*/
39 #define OUTPUT_DATA_RATE_800HZ          0x00
40 #define OUTPUT_DATA_RATE_400HZ          0x01
41 #define OUTPUT_DATA_RATE_200HZ          0x02
42 #define OUTPUT_DATA_RATE_100HZ          0x03
43 
44 /*oversample Ratio  OSR[1]*/
45 #define OVERSAMPLE_RATE_256             0x01
46 #define OVERSAMPLE_RATE_128             0x00
47 
48 #define SET_RESET_ON                    0x00
49 #define SET_ONLY_ON                     0x01
50 #define SET_RESET_OFF                   0x02
51 
52 #define QMC6310_DEFAULT_DELAY           200
53 
54 enum {
55     AXIS_X = 0,
56     AXIS_Y = 1,
57     AXIS_Z = 2,
58 
59     AXIS_TOTAL
60 };
61 
62 typedef struct {
63     signed char sign[3];
64     unsigned char map[3];
65 } QMC6310_map;
66 
67 extern int qmc6310_init(void);
68 extern uint8_t qmc6310_read_mag_xyz(float *data);
69 extern int qmc6310_write_reg(uint8_t addr, uint8_t data);
70 extern int qmc6310_read_block(uint8_t addr, uint8_t *data, uint8_t len);
71 extern int qmc6310_readHeading();
72 extern void qmc6310_deinit(void);
73 #endif
74 
75