1 /*
2  * Copyright (C) 2015-2021 Alibaba Group Holding Limited
3  */
4 
5 #include <stdlib.h>
6 #include <fcntl.h>
7 #include <sys/ioctl.h>
8 #include "aos/vfs.h"
9 
10 #include <vfsdev/timer_dev.h>
11 #include <drivers/char/u_device.h>
12 #include <drivers/u_ld.h>
13 
14 #if AOS_COMP_CLI
15 #include "aos/cli.h"
16 #endif
17 
vfs_timer_handler(void * arg)18 void vfs_timer_handler (void *arg) {
19     ddkc_info("enter %s arg:%p, fd = %d\r\n", __func__, arg, *((int *)arg));
20 
21     return;
22 }
23 
vfs_timer_test(int id)24 int vfs_timer_test(int id)
25 {
26     int ret = 0;
27     int fd = 0;
28     timer_alarm_t alarm;
29     timer_alarm_t ralarm;
30     char name[16] = {0};
31 
32     snprintf(name, sizeof(name), "/dev/timer%d", id);
33     fd = open(name, 0);
34     ddkc_info("open %s %s, fd:%d\r\n", name, fd >= 0 ? "success" : "fail", fd);
35     if (fd >= 0) {
36         // correct parameters
37         alarm.arg = &fd;
38         alarm.cb = vfs_timer_handler;
39         alarm.period = 1000000;
40         alarm.auto_reload = true;
41         /*period*/
42         ret = ioctl(fd, IOC_TIMER_IRQP_SET, (unsigned long)&alarm);
43         ddkc_info("ioctl on IOC_TIMER_IRQP_SET %s, ret:%d\r\n", ret ? "fail" : "succeed", ret);
44         ret = ioctl(fd, IOC_TIMER_CONTROL, (unsigned long)IO_TIMER_START);
45         ddkc_info("start timer %s, ret:%d\r\n", ret ? "fail" : "succeed", ret);
46         sleep(5);
47         alarm.period = 500000;
48         ret = ioctl(fd, IOC_TIMER_IRQP_SET, (unsigned long)&alarm);
49         ddkc_info("ioctl on IOC_TIMER_IRQP_SET %s, ret:%d\r\n", ret ? "fail" : "succeed", ret);
50         sleep(5);
51         ret = ioctl(fd, IOC_TIMER_CONTROL, (unsigned long)IO_TIMER_STOP);
52         ddkc_info("stop timer %s, ret:%d\r\n", ret ? "fail" : "succeed", ret);
53         ret = ioctl(fd, IOC_TIMER_IRQP_GET, (unsigned long)&ralarm);
54         ddkc_info("ioctl on IOC_TIMER_IRQP_GET %s, ret:%d\r\n", ret ? "fail" : "succeed", ret);
55         /*oneshot*/
56         alarm.auto_reload = false;
57         ret = ioctl(fd, IOC_TIMER_IRQP_SET, (unsigned long)&alarm);
58         ddkc_info("ioctl on IOC_TIMER_IRQP_SET %s, ret:%d\r\n", ret ? "fail" : "succeed", ret);
59         ret = ioctl(fd, IOC_TIMER_CONTROL, (unsigned long)IO_TIMER_START);
60         ddkc_info("start timer %s, ret:%d\r\n", ret ? "fail" : "succeed", ret);
61         sleep(5);
62         ret = ioctl(fd, IOC_TIMER_RELOAD, (unsigned long)0);
63         ddkc_info("reload timer %s, ret:%d\r\n", ret ? "fail" : "succeed", ret);
64         sleep(5);
65         ret = ioctl(fd, IOC_TIMER_CONTROL, (unsigned long)IO_TIMER_STOP);
66         ddkc_info("stop timer %s, ret:%d\r\n", ret ? "fail" : "succeed", ret);
67         ret = ioctl(fd, IOC_TIMER_IRQP_GET, (unsigned long)&ralarm);
68         ddkc_info("ioctl on IOC_TIMER_IRQP_GET %s, ret:%d\r\n", ret ? "fail" : "succeed", ret);
69         ddkc_info("ralarm period:%ld, cb:%p, arg:%p, auto_reload:%d\r\n",
70                ralarm.period, ralarm.cb, ralarm.arg, ralarm.auto_reload);
71 
72         close(fd);
73     }
74     return 0;
75 }
76 
vfs_timer_cli_cmd(int argc,char ** argv)77 static void vfs_timer_cli_cmd(int argc, char **argv)
78 {
79     int ret = 0;
80     int index = argc > 1 ? atoi(argv[1]) : 1;
81 
82     ddkc_info("argc:%d, index:%d\r\n", argc, index);
83     ret = vfs_timer_test(index);
84 
85     ddkc_info("vfs timer test %s, ret:%d\r\n", ret ? "failed" : "success", ret);
86 
87     return;
88 }
89 
90 
91 #if AOS_COMP_CLI
92 /* reg args: fun, cmd, description*/
93 ALIOS_CLI_CMD_REGISTER(vfs_timer_cli_cmd, hal_timer_example, timer vfs example)
94 #endif
95