1 /*
2  * Copyright (C) 2015-2020 Alibaba Group Holding Limited
3  *
4  *
5  */
6 #include "aos/hal/i2c.h"
7 #include "aos/kernel.h"
8 #include "rx8130ce.h"
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 
13 #ifndef I2C_ITF_SET
14 #include "pca9544.h"
15 #define I2C_BY_PCA9544
16 #define PCA9544_RTC_CHAN 5
17 
18 PCA9544_DEV_CFG_T dev_cfg = {
19     .dev_addr = PCA9544_BASE_ADDR,
20     .pca9544_ch = PCA9544_RTC_CHAN,
21     .subdev_addr = 0x32,
22     .reg_addr = 0x10,
23 };
24 
25 #endif
26 
27 /*********************************************************
28  * @fun    rtc_i2c_init
29  * @breif  rtc i2c initialization
30  * @param  i2c:the pointer for i2c configuration
31  * @rtn    0 : on success, EIO : error
32  *********************************************************/
rtc_i2c_init(i2c_dev_t * i2c)33 int rtc_i2c_init(i2c_dev_t *i2c)
34 {
35   int32_t ret;
36 
37   if (i2c == NULL) {
38     printf("i2c cfg is null\r\n");
39     return -1;
40   }
41 
42   ret = hal_i2c_init(i2c);
43   if (ret) {
44     printf("rtc i2c init fail \r\n");
45     return -1;
46   }
47 
48 #ifdef I2C_BY_PCA9544
49 
50   ret = pca9544_init(i2c, &dev_cfg);
51   if (ret) {
52     printf("rtc i2c(pca9544) init fail\r\n");
53     return -1;
54   }
55 
56   ret = pca9544_set_chan(PCA9544_RTC_CHAN);
57   if (ret) {
58     printf("pca9544 set rtc channel fail\r\n");
59     return -1;
60   }
61 #endif
62 }
63 
64 /*********************************************************
65  * @fun    rtc_i2c_write
66  * @param[in]  i2c            the i2c device
67  * @param[in]  dev_addr       device address
68  * @param[in]  reg_addr       register address
69  * @param[in]  reg_num        register num
70  * @param[in]  data           i2c master send data
71  * @param[in]  size           i2c master send data size
72  * @param[in]  timeout        timeout in milisecond, set this value to
73  *HAL_WAIT_FOREVER if you want to wait forever
74  *
75  * @rtn    0 : on success, EIO : error
76  *********************************************************/
rtc_i2c_write(i2c_dev_t * i2c,uint16_t dev_addr,uint16_t reg_addr,uint16_t reg_num,const uint8_t * data,uint16_t size,uint32_t timeout)77 int rtc_i2c_write(i2c_dev_t *i2c, uint16_t dev_addr, uint16_t reg_addr,
78                   uint16_t reg_num, const uint8_t *data, uint16_t size,
79                   uint32_t timeout)
80 {
81   int32_t ret = 0;
82 
83   if (i2c == NULL) {
84     printf("i2c param is null\r\n");
85     return -1;
86   }
87 #ifndef I2C_BY_PCA9544
88   ret =
89       hal_i2c_mem_write(i2c, dev_addr, reg_addr, reg_num, data, size, timeout);
90   if (ret) {
91     printf("rtc_i2c reg write failed\r\n");
92     return -1;
93   }
94 
95 #else
96   /*printf("rtc i2c: by pca9544");*/
97   ret = pca9544_raw_data_write(dev_addr, reg_addr, reg_num, data, size);
98   if (ret) {
99     printf("rtc reg write failed\r\n");
100     return -1;
101   }
102 #endif
103 }
104 
105 /*********************************************************
106  * @fun    rtc_i2c_read
107  *
108  * @param[in]   i2c            the i2c device
109  * @param[in]   dev_addr       device address
110  * @param[in]   reg_addr       register address
111  * @param[in]   reg_num        register number
112  * @param[out]  data           i2c master send data
113  * @param[in]   size           i2c master send data size
114  * @param[in]  timeout         timeout in milisecond, set this value to
115  *HAL_WAIT_FOREVER if you want to wait forever
116  *
117  * @rtn    0 : on success, EIO : error
118  *********************************************************/
rtc_i2c_read(i2c_dev_t * i2c,uint16_t dev_addr,uint16_t reg_addr,uint16_t reg_num,const uint8_t * data,uint16_t size,uint32_t timeout)119 int32_t rtc_i2c_read(i2c_dev_t *i2c, uint16_t dev_addr, uint16_t reg_addr,
120                      uint16_t reg_num, const uint8_t *data, uint16_t size,
121                      uint32_t timeout)
122 {
123   int32_t ret = 0;
124 
125   if (i2c == NULL) {
126     printf("i2c param is null\r\n");
127     return -1;
128   }
129 
130 #ifndef I2C_BY_PCA9544
131   ret = hal_i2c_mem_read(i2c, dev_addr, reg_addr, reg_num, data, size, timeout);
132   if (ret) {
133     printf("rtc_i2c reg read failed\r\n");
134     return -1;
135   }
136 #else
137   /*printf("rtc i2c: by pca9544");*/
138   ret = pca9544_raw_data_read(dev_addr, reg_addr, reg_num, data, size);
139   if (ret) {
140     printf("rtc reg read failed\r\n");
141     return -1;
142   }
143 #endif
144 }
145