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