1 /*
2  * Copyright (c) 2006-2018, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2017-11-14     勤为本       first version
9  */
10 
11 #include <rtthread.h>
12 #include <drivers/dev_i2c.h>
13 #include <drivers/dev_i2c_bit_ops.h>
14 #include "drv_i2c.h"
15 #include "../libraries/ls1c_gpio.h"
16 #include "../libraries/ls1c_delay.h"
17 
18 
19 #define LS1C_I2C_SCL                (51)    // gpio57
20 #define LS1C_I2C_SDA                (50)    // gpio56
21 
22 #define LS1C_SET_GPIO_MODE
23 
ls1c_i2c_gpio_init(void)24 static void ls1c_i2c_gpio_init(void)
25 {
26     gpio_init(LS1C_I2C_SCL, gpio_mode_output);
27     gpio_set(LS1C_I2C_SCL, gpio_level_high);
28 
29     gpio_init(LS1C_I2C_SDA, gpio_mode_output);
30     gpio_set(LS1C_I2C_SDA, gpio_level_high);
31 
32     return ;
33 }
34 
35 
ls1c_udelay(rt_uint32_t us)36 static void ls1c_udelay(rt_uint32_t us)
37 {
38     delay_us((int)us);
39 }
40 
41 
ls1c_set_sda(void * data,rt_int32_t state)42 static void ls1c_set_sda(void *data, rt_int32_t state)
43 {
44 #ifdef LS1C_SET_GPIO_MODE
45     gpio_init(LS1C_I2C_SDA, gpio_mode_output);
46     ls1c_udelay(5);
47 #endif
48     gpio_set(LS1C_I2C_SDA, state);
49     return ;
50 }
51 
52 
ls1c_set_scl(void * data,rt_int32_t state)53 static void ls1c_set_scl(void *data, rt_int32_t state)
54 {
55 #ifdef LS1C_SET_GPIO_MODE
56     gpio_init(LS1C_I2C_SCL, gpio_mode_output);
57     ls1c_udelay(5);
58 #endif
59     gpio_set(LS1C_I2C_SCL, state);
60     return ;
61 }
62 
63 
ls1c_get_sda(void * data)64 static rt_int32_t ls1c_get_sda(void *data)
65 {
66 #ifdef LS1C_SET_GPIO_MODE
67     gpio_init(LS1C_I2C_SDA, gpio_mode_input);
68     ls1c_udelay(5);
69 #endif
70     return gpio_get(LS1C_I2C_SDA);
71 }
72 
73 
ls1c_get_scl(void * data)74 static rt_int32_t ls1c_get_scl(void *data)
75 {
76 #ifdef LS1C_SET_GPIO_MODE
77     gpio_init(LS1C_I2C_SCL, gpio_mode_input);
78     ls1c_udelay(5);
79 #endif
80     return gpio_get(LS1C_I2C_SCL);
81 }
82 
83 
84 static const struct rt_i2c_bit_ops bit_ops =
85 {
86     .data       = RT_NULL,
87     .pin_init   = ls1c_i2c_gpio_init,
88     .set_sda    = ls1c_set_sda,
89     .set_scl    = ls1c_set_scl,
90     .get_sda    = ls1c_get_sda,
91     .get_scl    = ls1c_get_scl,
92     .udelay     = ls1c_udelay,
93     .delay_us   = 20,       // 此值为周期(us)
94     .timeout    = 10,       // 单位为tick
95     .i2c_pin_init_flag = RT_FALSE
96 };
97 
98 
99 
ls1c_i2c_init(void)100 int ls1c_i2c_init(void)
101 {
102     static struct rt_i2c_bus_device bus = {0};
103 
104     bus.priv = (void *)&bit_ops;
105 
106     rt_i2c_bit_add_bus(&bus, "i2c3");
107 
108     return RT_EOK;
109 }
110 
111 
112 
113 
114 
115