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