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