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