1 #include <stdlib.h>
2 #include <hal_log.h>
3 #include <hal_cmd.h>
4 #include <hal_clk.h>
5 #include <hal_reset.h>
6 #include <common_ccmu.h>
7 #include <rtthread.h>
8 
9 int clk_number[] = {
10     CLK_SRC_NUMBER,
11     CLK_RTC_NUMBER,
12     CLK_NUMBER,
13     CLK_R_NUMBER,
14     0
15 };
16 
17 int reset_number[] = {
18     RST_BUS_NUMBER,
19     RST_R_BUS_NUMBER,
20     0,
21 };
22 
23 char *strict_clks[] = {
24     "pll-ddr0",
25     "riscv",
26     "pll-cpux",
27     "pll-periph0-parent",
28     "riscv-axi",
29     "apb1",
30     "fanout-27m",
31     NULL,
32 };
33 
is_strict_clk(hal_clk_t clk)34 int is_strict_clk(hal_clk_t clk)
35 {
36     int i;
37     for (i = 0; strict_clks[i] != NULL; i++)
38     {
39         if (!strcmp(clk->name, strict_clks[i]))
40             return 1;
41     }
42 
43     return 0;
44 }
45 
esMEMS_FreeMemSize(void)46 static uint32_t esMEMS_FreeMemSize(void)
47 {
48     rt_uint32_t total, used, max_used;
49     rt_uint32_t aval;
50 
51     rt_memory_info(&total, &used, &max_used);
52     aval = total - used;
53     return aval;
54 }
55 
cmd_test_ng_ccmu(int argc,char ** argv)56 int cmd_test_ng_ccmu(int argc, char **argv)
57 {
58     int i, j;
59 
60     hal_clk_type_t clk_type;
61     hal_clk_id_t   clk_id;
62     hal_clk_status_t clk_status;
63     hal_clk_t clk, p_clk;
64     u32  old_rate, new_rate, p_rate;
65 
66     hal_reset_type_t reset_type;
67     hal_reset_id_t  reset_id;
68     struct reset_control *reset;
69     int reset_status;
70 
71     printf("free size = 0x%x\n", esMEMS_FreeMemSize());
72     for (i = HAL_SUNXI_FIXED_CCU; i < HAL_SUNXI_CCU_NUMBER; i++)
73     {
74         clk_type = i;
75         for (j = 0; j < clk_number[i]; j++)
76         {
77             clk_id = j;
78             printf("get clock, type:%d, id:%d\n", clk_type, clk_id);
79             clk = hal_clock_get(clk_type, clk_id);
80 
81             clk_status = hal_clock_is_enabled(clk);
82             printf("clock %s status:%s\n", clk->name, clk_status? "disabled" : "enabled");
83             printf("enable clock %s\n", clk->name);
84             hal_clock_enable(clk);
85             clk_status = hal_clock_is_enabled(clk);
86             printf("clock %s status:%s\n", clk->name, clk_status? "disabled" : "enabled");
87 
88             if (is_strict_clk(clk))
89                 continue;
90 
91             p_clk = hal_clk_get_parent(clk);
92             if (p_clk)
93             printf("clock %s\'s parent is: %s\n", clk->name, p_clk->name);
94             else
95             printf("clock %s is root clk\n", clk->name);
96 
97             old_rate = hal_clk_get_rate(clk);
98             printf("clockk %s rate: %d\n", clk->name, old_rate);
99             old_rate /= 2;
100             printf("clock %s set rate: %d\n", clk->name, old_rate);
101             hal_clk_set_rate(clk, old_rate);
102             new_rate = hal_clk_get_rate(clk);
103             printf("clock %s get rate: %d\n", clk->name, new_rate);
104 
105             //printf("disable clock %s\n", clk->name);
106             //hal_clock_disable(clk);
107             //clk_status = hal_clock_is_enabled(clk);
108             //printf("clock %s status:%s\n", clk->name, clk_status? "disabled" : "enabled");
109 
110             //hal_clock_put(p_clk);
111             //hal_clock_put(clk);
112         }
113     }
114 
115     printf("free size = 0x%x\n", esMEMS_FreeMemSize());
116     for (i = HAL_SUNXI_RESET; i < HAL_SUNXI_RESET_NUMBER; i++)
117     {
118     reset_type = i;
119     for (j = 0; j < reset_number[i]; j++)
120     {
121         reset_id = j;
122 
123         printf("reset: get reset control, type:%d, id: %d\n", reset_type, reset_id);
124         reset = hal_reset_control_get(reset_type, reset_id);
125 
126         printf("reset: control deassert\n");
127         hal_reset_control_deassert(reset);
128 
129         reset_status = hal_reset_control_status(reset);
130         printf("reset status: %s", reset_status ? "assert" : "deassert");
131 
132         printf("reset: put reset control, type:%d, id: %d\n", reset_type, reset_id);
133         hal_reset_control_put(reset);
134     }
135     }
136 
137     printf("free size = 0x%x\n", esMEMS_FreeMemSize());
138     return 0;
139 }
140 
141 MSH_CMD_EXPORT_ALIAS(cmd_test_ng_ccmu, hal_ccmu, sunxi - ng ccmu hal APIs tests)
142 
143