1 /*
2 * Copyright (C) 2015-2020 Alibaba Group Holding Limited
3 */
4
5 #include <stdio.h>
6 #include <aos/kernel.h>
7
8 #include "ulog/ulog.h"
9 #include "auto_app.h"
10 #include "k_api.h"
11 #if AOS_COMP_CLI
12 #include "aos/cli.h"
13 #endif
14 #include <sys/ioctl.h>
15 #include <vfsdev/gpio_dev.h>
16 #include <drivers/char/u_device.h>
17 #include <drivers/u_ld.h>
18 #include "aos/vfs.h"
19
20 #include "aos/hal/gpio.h"
21 #include "hal_iomux_haas1000.h"
22
23 static int fd = 0;
24
25
26 extern uint32_t hal_fast_sys_timer_get();
27 extern uint32_t hal_cmu_get_crystal_freq();
28
29 #define CONFIG_FAST_SYSTICK_HZ (hal_cmu_get_crystal_freq() / 4)
30 #define FAST_TICKS_TO_US(tick) ((uint32_t)(tick) * 10 / (CONFIG_FAST_SYSTICK_HZ / 1000 / 100))
31
32 #define IN1_PORT 0
33 #define IN2_PORT 1
34 #define IN3_PORT 2
35 #define IN4_PORT 3
36 #define ENA_PORT 4
37 #define ENB_PORT 5
38
39 #define IN1_PIN HAL_IOMUX_PIN_P4_7
40 #define IN2_PIN HAL_IOMUX_PIN_P4_0
41 #define IN3_PIN HAL_IOMUX_PIN_P2_6
42 #define IN4_PIN HAL_IOMUX_PIN_P4_6
43 #define ENA_PIN HAL_IOMUX_PIN_P2_4
44 #define ENB_PIN HAL_IOMUX_PIN_P2_5
45
46 #define DEMO_TIME_DEFAULT_MS 300
47
48 #if (RHINO_CONFIG_HW_COUNT > 0)
_udelay(unsigned long x)49 void _udelay(unsigned long x) {
50 unsigned long now,t;
51
52 t = FAST_TICKS_TO_US(hal_fast_sys_timer_get());
53 now = t;
54 while ((now - t) < x) {
55 now = FAST_TICKS_TO_US(hal_fast_sys_timer_get());
56 }
57 }
58
_msdelay(unsigned long x)59 void _msdelay(unsigned long x) {
60 _udelay(x * 1000);
61 }
62 #else
63 #error "RHINO_CONFIG_HW_COUNT should be configured to get us level delay"
64 #endif
65
66 //auto gpio set
GPIO_Set(unsigned char port,unsigned char leve)67 static void GPIO_Set(unsigned char port,unsigned char leve)
68 {
69 struct gpio_io_config config;
70
71 switch(port){
72 case IN1_PORT:
73 config.id = IN1_PIN;//8*4 + 7;
74 break;
75
76 case IN2_PORT:
77 config.id = IN2_PIN;//8*4 + 0;
78 break;
79
80 case IN3_PORT:
81 config.id = IN3_PIN;//8*2 + 6;
82 break;
83
84 case IN4_PORT:
85 config.id = IN4_PIN;//8*4 + 6;
86 break;
87
88 case ENA_PORT:
89 config.id = ENA_PIN;//8*2 + 4;
90 break;
91
92 case ENB_PORT:
93 config.id = ENB_PIN;//8*2 + 5;
94 break;
95
96 default:
97 break;
98 }
99 config.config = GPIO_IO_OUTPUT | GPIO_IO_OUTPUT_ODPU;
100 if(leve == 1){
101 config.data = 1;
102 }
103 else if(leve == 0){
104 config.data = 0;
105 }
106 ioctl(fd, IOC_GPIO_SET, (unsigned long)&config);
107 }
108
109 //停止
stop_ctl(void)110 void stop_ctl(void)
111 {
112 GPIO_Set(IN1_PORT,0);
113 GPIO_Set(IN2_PORT,0);
114 GPIO_Set(IN3_PORT,0);
115 GPIO_Set(IN4_PORT,0);
116 }
117
118 //前进
front_ctl(void)119 void front_ctl(void)
120 {
121 GPIO_Set(IN1_PORT,1);
122 GPIO_Set(IN2_PORT,0);
123 GPIO_Set(IN3_PORT,0);
124 GPIO_Set(IN4_PORT,1);
125 _msdelay(DEMO_TIME_DEFAULT_MS);
126 stop_ctl();
127 }
128
129 //后退
back_ctl(void)130 void back_ctl(void)
131 {
132 GPIO_Set(IN1_PORT,0);
133 GPIO_Set(IN2_PORT,1);
134 GPIO_Set(IN3_PORT,1);
135 GPIO_Set(IN4_PORT,0);
136 _msdelay(DEMO_TIME_DEFAULT_MS);
137 stop_ctl();
138 }
139
140 //左转
left_ctl(void)141 void left_ctl(void)
142 {
143 GPIO_Set(IN1_PORT,0);
144 GPIO_Set(IN2_PORT,0);
145 GPIO_Set(IN3_PORT,0);
146 GPIO_Set(IN4_PORT,1);
147 _msdelay(DEMO_TIME_DEFAULT_MS);
148 stop_ctl();
149 }
150
151 //右转
right_ctl(void)152 void right_ctl(void)
153 {
154 GPIO_Set(IN1_PORT,1);
155 GPIO_Set(IN2_PORT,0);
156 GPIO_Set(IN3_PORT,0);
157 GPIO_Set(IN4_PORT,0);
158 _msdelay(DEMO_TIME_DEFAULT_MS);
159 stop_ctl();
160 }
161
handle_haas_cmd(char * pwbuf,int blen,int argc,char ** argv)162 static void handle_haas_cmd(char *pwbuf, int blen, int argc, char **argv)
163 {
164 if(0 == strcmp(argv[1],"0")){
165 stop_ctl();
166 LOGI("APP", "stop\n");
167 }
168 else if(0 == strcmp(argv[1],"1")){
169 front_ctl();
170 LOGI("APP", "front\n");
171 }
172 else if(0 == strcmp(argv[1],"2")){
173 back_ctl();
174 LOGI("APP", "back\n");
175 }
176 else if(0 == strcmp(argv[1],"3")){
177 left_ctl();
178 LOGI("APP", "left\n");
179 }
180 else if(0 == strcmp(argv[1],"4")){
181 right_ctl();
182 LOGI("APP", "right\n");
183 }
184 }
185
186 #if AOS_COMP_CLI
187
188 static struct cli_command haas_cmd = {
189 .name = "haas",
190 .help = "haas [read]",
191 .function = handle_haas_cmd
192 };
193
auto_app_init(void)194 int auto_app_init(void)
195 {
196 gpio_dev_t temp_gpio;
197
198 temp_gpio.port = IN1_PIN;
199 temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;
200 hal_gpio_init(&temp_gpio);
201 temp_gpio.port = IN2_PIN;
202 temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;
203 hal_gpio_init(&temp_gpio);
204 temp_gpio.port = IN3_PIN;
205 temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;
206 hal_gpio_init(&temp_gpio);
207 temp_gpio.port = IN4_PIN;
208 temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;
209 hal_gpio_init(&temp_gpio);
210
211 temp_gpio.port = ENA_PIN;
212 temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;
213 hal_gpio_init(&temp_gpio);
214 temp_gpio.port = ENB_PIN;
215 temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;
216 hal_gpio_init(&temp_gpio);
217
218 fd = open("/dev/gpio", 0);
219 printf("open gpio %s, fd:%d\r\n", fd >= 0 ? "success" : "fail", fd);
220
221 GPIO_Set(ENA_PORT,1);
222 GPIO_Set(ENB_PORT,1);
223 stop_ctl();
224
225 aos_cli_register_command(&haas_cmd);
226 return 0;
227 }
228 #endif /* AOS_COMP_CLI */
229